如何得到docker构成使用从存储库的最新的图像

我不知道我在做什么错误,但是我根本无法从docker-compose up中使用我们registry中的最新映像,而无需先从系统中完全删除旧的容器。 它看起来像撰写是使用以前启动的图像,即使docker组成拉取得了一个较新的形象。

我看了如何得到docker合成总是从新的图像重新创build容器? 这似乎与我的问题类似,但没有提供的解决scheme在那里为我工作,因为我正在寻找一个解决scheme,我可以在生产服务器上使用,在那里我不想被删除所有的容器,然后才开始再次(可能的数据丢失?)。 我只想撰写检测更改的图像的新版本,拉他们,然后重新启动与这些新的图像的服务。

我为此创build了一个简单的testing项目,其中唯一的目标是在每个新版本上增加一个版本nr。 如果我浏览到创build的nginx服务器(这在本地按预期工作),则会显示版本nr。

docker版本:1.11.2 docker-compose版本:1.7.1操作系统:使用docker-toolbox在CentOS 7和OS X 10.10上testing

我的docker-compose.yml:

 version: '2' services: application: image: ourprivate.docker.reg:5000/ourcompany/buildchaintest:0.1.8-dev volumes: - /var/www/html tty: true nginx: build: nginx ports: - "80:80" volumes_from: - application volumes: - ./logs/nginx/:/var/log/nginx php: container_name: buildchaintest_php_1 build: php-fpm expose: - "9000" volumes_from: - application volumes: - ./logs/php-fpm/:/var/www/logs 

在我们的jenkins服务器上,我运行以下内容来构build和标记图像

 cd $WORKSPACE && PROJECT_VERSION=$(cat VERSION)-dev /usr/local/bin/docker-compose rm -f /usr/local/bin/docker-compose build docker tag ourprivate.docker.reg:5000/ourcompany/buildchaintest ourprivate.docker.reg:5000/ourcompany/buildchaintest:$PROJECT_VERSION docker push ourprivate.docker.reg:5000/ourcompany/buildchaintest 

这似乎是做它应该是因为我得到一个新的版本标签在我们的存储库每次构build完成和版本nr已被撞。

如果我现在跑

 docker-compose pull && docker-compose -f docker-compose.yml up -d 

在我的计算机上的一个文件夹中,其中的内容只是docker-compose.yml和必要的Dockerfiles来构buildnginx和php服务,我得到的输出并不是已经在registry中标记的最新版本号或显示在docker-compose.yml(0.1.8)中,但之前的版本是0.1.7。 然而,pull命令的输出将暗示获取了新版本的图像:

 Pulling application (ourprivate.docker.reg:5000/ourcompany/buildchaintest:latest)... latest: Pulling from ourcompany/buildchaintest Digest: sha256:8f7a06203005ff932799fe89e7756cd21719cccb9099b7898af2399414bfe62a Status: Downloaded newer image for docker.locotech.fi:5000/locotech/buildchaintest:0.1.8-dev 

只有当我跑步

 docker-compose stop && docker-compose rm -f 

然后运行docker-compose up命令,按照预期的方式获取新版本。

这是docker-compose的预期行为吗? 也就是说,在运行之前,我应该一直做一个docker-compose rm -f ,即使是在生产服务器上? 或者,我在这里做什么反对粮食,这是为什么它不工作?

我们的目标是让我们的构build过程构build并创builddocker-compose.yml中所需图像的标记版本,将它们推送到我们的私有registry中,然后将其发布到“发布到生产步骤”以简单复制docker-compose。 yml添加到生产服务器,然后运行docker-compose pull && docker-compose -f docker-compose.yml up -d ,以便在生产中启动新映像。 如果任何人有这方面的提示或可以指向这种设置的最佳做法教程,将不胜感激也。

为了确保您使用最新的版本作为您的registry的:latest标签(例如docker hub),您还需要再次获取最新的标签。 如果发生变化,差异将被下载,并开始时,你的docker-compose up再次docker-compose up

所以这将是一条路:

 docker-compose stop docker-compose rm -f docker-compose pull docker-compose up -d 

我把这个粘在一个图片,我开始docker合成,并确保图像保持最新: https : //hub.docker.com/r/stephanlindauer/docker-compose-updater/

为了解决这个问题,似乎已经奏效了

 docker-compose stop docker-compose rm -f docker-compose -f docker-compose.yml up -d 

即在再次运行之前移除容器。

这样做时需要注意的是,如果您只是运行rm -f ,数据卷容器也会被删除。 为了防止我明确指定要删除的每个容器:

 docker-compose rm -f application nginx php 

正如我在问题中所说,我不知道这是否正确。 但是,这似乎适用于我们的用例,所以直到find更好的解决scheme,我们才能使用这个解决scheme。

我已经看到这发生在我们的7-8docker生产系统。 另一个解决scheme是在生产中运行

 docker-compose down docker-compose up -d 

这将移除容器,并且似乎会使最新的图像创build新的容器。

这还没有解决我梦想每个每个更改的容器(连续,减less停机时间)下降+,但它的作品强制'更新'容器。

“up”命令的docker-compose文档明确指出,如果自从执行最后的“up”之后更改映像,它将更新容器:

如果存在服务的容器,并且在创build容器后服务的configuration或映像已更改,则docker-compose将通过停止并重新创build容器(保留已装入的卷)来提取更改。

因此,通过使用“停止”,然后“拉”,然后“上”,这应该避免了正在运行的容器丢失卷的问题,当然,对于其图像已被更新的容器除外。

我目前正在试验这个过程,很快就会把我的结果包括在这个评论中。

要获取最新的图像,使用docker-compose build –pull

我使用下面的命令,这是真正的3合1

  "docker-compose down && docker-compose build --pull && docker-compose up -d" 

此命令将停止服务,拉取最新的图像,然后启动服务。