web-dev-qa-db-ja.com

docker-compose imageフィールドを動的に変更する方法

私は次のようなdocker-compose.ymlを持っています:

networks:
  smstake: 
    ipam:
      config:
        - subnet: 10.0.10.0/24
services:
    app:

        image: smstake:latest
        ports:
          - 8000:80
        networks:
          - smstake

        depends_on:
          - db
        deploy:
          mode: replicated
          replicas: 1
          placement:
            constraints:
              - node.role == manager

スウォームモードで実行されているノードにサービスをデプロイするために使用しています。

イメージがビルドされるたびに、ユーザーが渡したブランチ名またはイメージのタグとして機能するタグ名に基づいて、イメージ名が異なる場合があります。私はジェンキンスからそれを実行しています。例:smstake:

サービスの画像パラメーターに画像名を動的に追加するにはどうすればよいですか。 Dockerスタックはビルドをサポートしていないため。使用すらできません。私はそれを行う正しい方法を理解することができません。

docker stack deploy -c docker-compose.yml stacknameで展開しようとしています

私の正確な要件は:

  1. Jenkinsでビルドジョブを実行して、イメージをビルドします。
  2. タグまたはブランチ名が変更されると、イメージ名が異なるか変更されます
  3. 新しく作成したイメージを使用してジョブを再度デプロイするビルドジョブがあります。

新しいTAGの新しいイメージを作成する理由は、以前にビルドしたイメージにロールバックできるようにするためです。

一部編集:配置コマンドが実行される前に配置ジョブのエコーコマンドを使用して渡されるconfiguration.envファイルに追加するイメージ名を追加しました。 docker-composeは次のようになります

version: '3.4'
networks:
  smstake: 

services:

    db:
        image: mysql:5.7
        networks:
          - smstake
        ports:
          - "3306"
        env_file:
          - configuration.env
        environment:
          MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
          MYSQL_DATABASE: ${DB_NAME}
          MYSQL_USER: ${DB_USER}
          MYSQL_PASSWORD: ${DB_PASSWORD}
        volumes:
          - mysql_data:/var/lib/mysql
        deploy:
          mode: replicated
          replicas: 1

    app:
        env_file:
          - configuration.env
        image: ${SMSTAKE_VERSION}
        ports:
          - 8000:80
        networks:
          - smstake
        depends_on:
          - db
        deploy:
          mode: replicated
          replicas: 1
          placement:
            constraints:
              - node.role == manager
volumes:
    mysql_data:

Configuration.envファイルから読み取らないのはなぜですか、そのキーに正しい値が設定されています。エラーメッセージ

サービスの作成smstake_appはサービスsmstake_appの作成に失敗しました:デーモンからのエラー応答:rpcエラー:コード= InvalidArgument desc = ContainerSpec:イメージ参照を提供する必要がありますビルドステップ「シェルの実行」とマークされたビルド失敗終了時:FAILURE

7

Docker-composeファイルでは、環境変数に基づいて変数の代替を指定できます。これは Variable Substitution で文書化されています。

以下を使用して、イメージに別のバージョンを指定できます。

image: smstake:${SMSTAKE_VERSION}

デプロイするjenkinsジョブ内で、この環境変数を設定してdocker stackコマンドを実行するだけです。

SMSTAKE_VERSION=v1.2.0 docker stack deploy -c docker-compose.yml stackname
10
yamenk