如何动态更改docker-compose图像字段

时间:2018-04-01 10:45:56

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

我有一个像波纹管一样的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:

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

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

进行部署

我的确切要求是:

  1. 在jenkins有一个构建工作,为我们构建图像。
  2. 如果标签或分支名称发生变化,图像名称会有所不同或更改
  3. 我们有一个构建作业,可以使用新创建的图像再次部署作业。
  4. 为新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错误:code = InvalidArgument desc = ContainerSpec:必须提供图像引用 构建步骤'执行shell'将构建标记为失败 完成:失败

1 个答案:

答案 0 :(得分:6)

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

您可以使用以下内容为图像指定其他版本:

image: smstake:${SMSTAKE_VERSION}

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

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