[英]How to dynamically change the docker-compose image field
我有一个类似下面的 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
进行部署
我的确切要求是:
为新标签创建新映像的原因是我可以回滚到以前构建的映像。
一些编辑:添加图像名称以添加到 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:必须提供图像参考构建步骤“执行外壳”标记构建为失败已完成:失败
在 docker-compose 文件中,您可以根据环境变量进行变量替换。 这记录在变量替换下。
您可以使用以下内容为图像指定不同的版本:
image: smstake:${SMSTAKE_VERSION}
在部署的 jenkins 作业中,您可以设置此环境变量并运行 docker stack 命令:
SMSTAKE_VERSION=v1.2.0 docker stack deploy -c docker-compose.yml stackname
您需要分两个阶段进行
docker-compose config | docker stack deploy -c - stackname
您需要使用docker-compose
而不是docker compose
V2,因为docker stack
不支持无version
的清单(至少在撰写本文时尚未发布的 21.xx 版本之前不支持)
您还可以获得使用.env
文件来读取您的环境的额外好处,这也使开发人员也很容易。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.