複数のサービスを含むdocker composeファイルを作成しました。これらのサービスのイメージは、「ビルド」構成オプションを使用してランタイムでビルドされます。対応するDockerfileは、それぞれのディレクトリにあります。
サンプルdocker composeファイル...
version: '3'
services:
db2server:
build: ./db2server
ports:
- "50005:50000"
command: ["db2start"]
appruntime:
build: ./appruntime
depends_on:
- db2server
このdocker composeファイルは、docker-compose
コマンドで機能します。
db2server
およびappruntime
ディレクトリにあるDockerfileから実行時に構築されますしかし、これをdocker swarmにデプロイしようとすると、次のエラーがスローされます...
docker stack deploy -c /home/docker/docker-compose.yml app
Ignoring unsupported options: build
Creating network app_default
Creating service app_db2server
failed to create service app_db2server: Error response from daemon: rpc error: code = InvalidArgument desc = ContainerSpec: image reference must be provided
Docker swarmでのスタックのデプロイ中、「ビルド」構成オプションは無視されるようです。
Docker Swarmのdocker composeファイルで定義されたこれらのサービス(ビルドオプション付き)をデプロイするにはどうすればよいですか。
簡単に言えば、docker stack deploy
でbuild
コマンドを使用することはできません。
docs から:
注:(バージョン3)Composeファイルを使用してスウォームモードでスタックをデプロイする場合、
docker stack
コマンドbuild
オプションは無視されます。docker stack
コマンドは、ビルド済みのイメージのみを受け入れます。
別の方法は、Swarmクラスターをデプロイする前にDockerイメージを構築することです。
docker build
コマンドを使用して、Dockerイメージを作成します。作成された画像を(パブリックまたはプライベート)docker registry
;にプッシュします。 docker compose
ファイルで参照します。
docs のビルドセクションで見ることができるように、ビルドパラメーターとともにイメージパラメーターを設定することで、作成中のビルドイメージにタグを付けることができます。したがって、ファイルは次のようになります。
version: '3'
services:
db2server:
image: <your registry here>/db2server
build: ./db2server
ports:
- "50005:50000"
command: ["db2start"]
appruntime:
image: <your registry here>/appruntime
build: ./appruntime
depends_on:
- db2server
その後、次のことができます:
docker-compose build
docker-compose Push
docker stack deploy -c /home/docker/docker-compose.yml app
構成ファイルは両方のツールを提供します:docker-compose
cli、およびdocker stack
cli。 「ビルド」オプションはdocker-compose
が、スタックコマンドでは無視され、「デプロイ」オプションはスタックコマンドで機能しますが、docker-compose
。
Swarmは、画像を作成するようには設計されていません。画像が画像レジストリで利用可能であることを前提としています。 Swarmの複数のノードは互いにイメージを共有できないため、レジストリ(リモートまたはSwarm自体で実行中)が、同じイメージを確実にプルできる唯一の方法です。
そのため、典型的な例は、コードコミットに基づいてDocker Hubで画像を自動構築するか、CI/CDプラットフォームで画像を構築してレジストリにプッシュすることです。次に、stack deploy
コマンドは、そのレジストリから適切なイメージを取得します。