web-dev-qa-db-ja.com

Docker swarm:スタック展開中にdocker composeファイルの 'build'設定が無視される

複数のサービスを含む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ファイルで定義されたこれらのサービス(ビルドオプション付き)をデプロイするにはどうすればよいですか。

14
dinup24

簡単に言えば、docker stack deploybuildコマンドを使用することはできません。

docs から:

:(バージョン3)Composeファイルを使用してスウォームモードでスタックをデプロイする場合、docker stackコマンドbuildオプションは無視されます。 docker stackコマンドは、ビルド済みのイメージのみを受け入れます。

別の方法は、Swarmクラスターをデプロイする前にDockerイメージを構築することです。

docker build コマンドを使用して、Dockerイメージを作成します。作成された画像を(パブリックまたはプライベート)docker registry;にプッシュします。 docker composeファイルで参照します。

13

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
9
vlizana

構成ファイルは両方のツールを提供します:docker-compose cli、およびdocker stack cli。 「ビルド」オプションはdocker-composeが、スタックコマンドでは無視され、「デプロイ」オプションはスタックコマンドで機能しますが、docker-compose

Swarmは、画像を作成するようには設計されていません。画像が画像レジストリで利用可能であることを前提としています。 Swarmの複数のノードは互いにイメージを共有できないため、レジストリ(リモートまたはSwarm自体で実行中)が、同じイメージを確実にプルできる唯一の方法です。

そのため、典型的な例は、コードコミットに基づいてDocker Hubで画像を自動構築するか、CI/CDプラットフォームで画像を構築してレジストリにプッシュすることです。次に、stack deployコマンドは、そのレジストリから適切なイメージを取得します。

3
Bret Fisher