DockerによるAirConnectのコンテナ化:自動デプロイと継続的更新の実装

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に統一

タグ: airconnect Docker upnp chromecast sonos

5月31日 19:30 投稿