在我的CI环境中有几个构建版本,我需要获得docker-compose
的特定版本:
registry.example.com/foo/core 0.1.3
registry.example.com/foo/core 0.2.2
... # multiple packages in several versions like this
图像构建如下:
build:
stage: build
script:
...
- docker build -t $CI_REGISTRY_IMAGE:$VERSION .
- docker push $CI_REGISTRY_IMAGE:$VERSION
他们被部署在这样的管道上:
production:
stage: deploy
script:
- docker pull $CI_REGISTRY_IMAGE:$VERSION
我还使用docker-compose从该图像启动所有微服务:
$ docker-compose up -d
但现在这是我的问题。我在哪里可以存储应该使用哪个版本的图像?硬编码它看起来像这样 - 但这总是会从0.2.2开始,尽管部署管道可以拉出不同的版本,如0.1.3:
core:
container_name: core
image: 'registry.example.com/foo/core:0.2.2'
restart: always
links:
- 'mongo_live'
environment:
- ROOT_URL=https://example.com
- MONGO_URL=mongodb://mongo_live/example
但是应该更好地将版本设置为变量。所以我认为在部署时,我必须在某处存储当前的$VERSION
- 值。在运行docker-compose 时,应该读取版本值以获取正确的版本,因为最新版本并不总是被选中。
答案 0 :(得分:0)
如果将其作为变量传递,则将其存储在CI环境中定义环境变量的位置。您还可以将值存储在.env
described here。
使用环境(或.env
文件)中定义的变量在docker-compose.yml
中会有一行:
image: registry.example.com/foo/core:${VERSION}
就个人而言,我采取了不同的方法,让注册服务器维护带有标签的图像版本。如果您有dev,stage和prod的3个版本,则可以构建registry.example.com/foo/core:0.2.2
,然后将该图像标记为registry.example.com/foo/core:dev
。后端映像校验和可以由多个标记引用,而不占用注册表服务器或docker主机上的额外磁盘空间。然后在你的开发环境中,你只需要docker-compose pull && docker-compose up -d
来获取开发图像并将其旋转。这种方法的唯一缺点是标签会屏蔽当前正在使用dev
的图像版本,因此您需要以其他方式跟踪。
在docker中标记图像使用docker tag
命令。你会运行:
docker tag registry.example.com/foo/core:${VERSION} registry.example.com/foo/core:dev
docker push registry.example.com/foo/core:${VERSION}
docker push registry.example.com/foo/core:dev
如果注册表已有registry.example.com/foo/core:dev
标记,则会被指向新图片ID的新标记替换。