AirConnectは、AirPlay対応デバイスからUPnP(例:Sonos)、Chromecast向けに音声ストリーミングを可能にするオープンソースツールです。Dockerを活用することで、OS依存性を排除し、ネットワーク構成や設定管理を一元化した運用が実現できます。本稿では、最小限の手順で動作するカスタムDockerイメージの作成、Composeによるサービス定義、およびCI/CD連携可能な自動更新フローを解説します。
前提条件の確認
以下のコンポーネントがインストール済みであることを確認してください:
- Docker Engine v24.0 以上(rootlessモード非推奨)
- Docker Compose v2.20+(plugin形式)
- git 2.35+
検証コマンド:
docker version --format '{{.Server.Version}}' && docker compose version --short
ソースコードの取得と構造理解
公式ミラーからリポジトリをクローンし、主要コンポーネントを識別します:
git clone https://gitcode.com/gh_mirrors/ai/AirConnect.git airconnect-deploy && cd airconnect-deploy
ディレクトリ構成の要点:
airupnp/:UPnPデバイス(Sonosなど)との通信を担当aircast/:Chromecast向けMIME変換と投映制御buildall.sh:静的リンク済みバイナリ生成スクリプト
軽量コンテナイメージの構築
Alpine Linuxベースでビルド環境を最小化し、不要な依存を除外します。以下はDockerfileの再設計例:
FROM alpine:3.19 AS builder
RUN apk add --no-cache build-base cmake git && \
mkdir -p /src && cd /src && \
git clone --depth=1 https://gitcode.com/gh_mirrors/ai/AirConnect.git . && \
chmod +x buildall.sh && \
./buildall.sh
FROM alpine:3.19
RUN apk add --no-cache libstdc++ libgcc
COPY --from=builder /src/airupnp/airupnp /usr/local/bin/airupnp
COPY --from=builder /src/aircast/aircast /usr/local/bin/aircast
VOLUME ["/config"]
EXPOSE 49152-65535/udp 49152-65535/tcp
ENTRYPOINT ["/usr/local/bin/airupnp"]
CMD ["-x", "/config/config.xml", "-f", "/config/log.txt"]
ビルド実行:
docker build -t airconnect-core .
Composeによるサービス定義
docker-compose.ymlでホストネットワークと永続化設定を明示:
version: '3.8'
services:
media-bridge:
image: airconnect-core
container_name: ac-bridge
network_mode: host
restart: unless-stopped
volumes:
- ./conf:/config:ro
- ./logs:/var/log/airconnect
environment:
- TZ=Asia/Tokyo
healthcheck:
test: ["CMD", "pidof", "airupnp"]
interval: 30s
timeout: 5s
retries: 3
※ UPnPディスカバリーにはマルチキャストトラフィックが必要なため、hostネットワークは必須です。
デプロイと監視
起動と状態確認:
docker compose up -d
docker compose ps --format "table {{.Name}}\t{{.Status}}\t{{.Ports}}"
docker compose logs -t --tail=50 media-bridge
継続的更新戦略
オプション1:Git-triggered リビルド
GitHub ActionsやGitLab CIで以下フローを定義可能です:
- タグ付きリリース時にDocker Hubへpush
- ホスト側で
docker pull airconnect-core:latest && docker compose up -d
オプション2:Watchtowerによる自動更新
docker-compose.ymlに追加:
watchtower:
image: ghcr.io/containrrr/watchtower:latest
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- WATCHTOWER_CLEAN_UP=true
- WATCHTOWER_POLL_INTERVAL=7200
command: --label-enable media-bridge
対象コンテナにラベルcom.centurylinklabs.watchtower.enable=trueを付与すれば、イメージ差分検知後に再起動されます。
トラブルシューティングのポイント
- デバイスが表示されない:ファイアウォールでUDPポート
1900(SSDP)と5353(mDNS)を開放 - 音声が途切れる:ホストのCPU負荷を確認し、
cpus: '0.75'などの制限を追加 - 設定ファイルが読み込まれない:
/configボリュームのパーミッションを644に、所有者をroot:rootに統一