2017-04-16 81 views
0

在我的CI环境有几个内部版本,我需要得到特定的版本为docker-composeDocker:在哪里存储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

如果您将它作为变量传递,您可以将其存储在您定义CI环境中的环境变量的位置。您也可以将这些值存储在.envdescribed here中。

使用环境中定义(或.env文件)的变量将会在docker-compose.yml这样一行:

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

就个人而言,我会采取不同的方法,让注册服务器维护的版本带有标签的图像。如果您有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替换。

+0

如何标记现有图像与第二个?例如0.2.2也应该得到'当前'标签。如果我想给另一个版本加上当前的标签,会发生什么情况,比如说0.2.3应该是'current',但是然后0.2.2应该会松动'current'标签... – user3142695

+0

我已经用docker更新了这个问题标签“命令。当你创建一个标签时,你正在创建一个指向图像ID的指针。如果该标签已经存在(本地运行标签命令,或者远程运行push命令时),现有标签将被替换。您需要在目标主机上拉取图像,以便对该主机上的此标记进行任何更改,并且'docker-compose up -d'知道图像是否发生了变化,并且将重新创建具有正在使用的旧图像的任何容器。 – BMitch