【问题标题】:How to dynamically change the docker-compose image field如何动态更改 docker-compose 图像字段
【发布时间】:2018-04-01 10:45:56
【问题描述】:

我有一个类似下面的 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

我正在使用它在以 swarm 模式运行的节点中部署服务。

每次构建映像时,映像名称可能会根据用户传递的分支名称或用作映像标记的标记名而有所不同。我从詹金斯那里运行它。例如:smstake:

如何将图像名称动态添加到服务的图像参数中。由于 docker stack 不支持构建。我什至不能使用它。 我无法找出正确的方法。

我正在尝试使用 docker stack deploy -c docker-compose.yml stackname 进行部署

我的确切要求是:

  1. 在 jenkins 中有一个构建工作,它为我们构建映像。
  2. 如果标签或分支名称发生变化,图像名称会不同或发生变化
  3. 我们有一个构建作业,可以使用新创建的映像再次部署这些作业。

为新 TAG 创建新映像的原因是我可以回滚到以前构建的映像。

一些修改: 添加了要添加到 configuration.env 文件中的图像名称,该文件将在部署命令运行之前在部署作业中使用 echo 命令传递。比 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:必须提供图像参考 构建步骤“执行 shell”将构建标记为失败 完成:失败

【问题讨论】:

  • 但是可以使用版本回滚,即image: smstake:12345678901234567890
  • @ConstantinGalbenu 我应该从哪里得到那个版本以及什么会流动
  • 从 docker 仓库,你可以看到历史

标签: docker jenkins docker-compose docker-swarm docker-stack


【解决方案1】:

在 docker-compose 文件中,您可以根据环境变量进行变量替换。这记录在Variable Substitution 下。

您可以使用以下内容为图像指定不同的版本:

image: smstake:${SMSTAKE_VERSION}

在部署的 jenkins 作业中,您可以设置此环境变量并运行 docker stack 命令:

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

【讨论】:

  • 是的,我完全按照您的建议进行操作。我如何确认或以任何方式检查它是否成功获得价值。而不是在我支持你的答案之后。谢谢
  • 这真的不行。该值未传递到 docker-compose.yml 中的图像字段,因此我遇到了问题。 failed to create service smstake_app: Error response from daemon: rpc error: code = InvalidArgument desc = ContainerSpec: image reference must be provided。根据错误 jenkins 错误日志,它没有获取 docker-compose.yml 中设置的图像名称
  • @TaraPrasadGurung 您可以运行docker-compose config 命令来验证您是否设置了正确的值。见docs.docker.com/compose/environment-variables/#the-env-file
  • 缺少$:image: smstake:${SMSTAKE_VERSION}
  • 如果变量通过 ARG 在 dockerfile 中声明,则此方法有效。 ARG SMSTAKE_VERSION \n FROM smstake:${SMSTAKE_VERSION}
猜你喜欢
  • 1970-01-01
  • 2018-08-25
  • 1970-01-01
  • 1970-01-01
  • 2015-07-16
  • 1970-01-01
  • 1970-01-01
  • 2017-08-18
  • 1970-01-01
相关资源
最近更新 更多