Docker:Docker-compose中存储多个图像的版本在哪里?

在我的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的:

 build: stage: build script: ... - docker build -t $CI_REGISTRY_IMAGE:$VERSION . - docker push $CI_REGISTRY_IMAGE:$VERSION 

而且他们被拉到像这样的部署pipe道:

 production: stage: deploy script: - docker pull $CI_REGISTRY_IMAGE:$VERSION 

我也使用docker-compose从该映像启动所有微服务:

 $ docker-compose up -d 

但现在这是我的问题。 我在哪里可以存储每个图像的哪个版本应该被使用? 硬编码它看起来像这样 – 但总是会启动0.2.2,虽然部署pipe道可以拉一个不同的版本,如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 

但版本应该更好地设置为一个variables。 所以我会认为在部署我必须存储当前$VERSION值的地方。 在运行docker-compose时 ,应读取版本值以获取正确版本,因为最新版本并不总是选定的版本。

如果你把它作为一个variables传递,你可以将它存储在你的CI环境中定义你的环境variables的地方。 您也可以将值存储在此处所述的.env中。

使用环境(或.env文件)中定义的variables将在.env docker-compose.yml有一行, docker-compose.yml所示:

 image: registry.example.com/foo/core:${VERSION} 

就个人而言,我会采取一种不同的方法,让registry服务器保持带有标签的图像版本。 如果您有3个版本的开发,阶段和产品,您可以构build您的registry.example.com/foo/core:0.2.2 ,然后标记为registry.example.com/foo/core:dev相同的图像。 后端映像校验和可以被多个标记引用,而不占用registry服务器或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已经有了registry.example.com/foo/core:dev的标签,它将被replace为指向新图像标识的新标签。