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

时间:2017-04-16 19:46:34

标签: 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:
  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 时,应该读取版本值以获取正确的版本,因为最新版本并不总是被选中。

1 个答案:

答案 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的新标记替换。