【发布时间】:2016-06-07 17:24:19
【问题描述】:
我不知道自己做错了什么,但如果不先从系统中完全删除旧容器,我根本无法让 docker-compose up 使用我们注册表中的最新映像。尽管 docker-compose pull 获取了更新的图像,但 compose 似乎正在使用之前启动的图像。
我查看了How to get docker-compose to always re-create containers from fresh images?,这似乎与我的问题相似,但那里提供的解决方案都不适合我,因为我正在寻找可以在生产服务器上使用的解决方案,但我没有想要在再次启动它们之前移除所有容器(可能的数据丢失?)。我希望 compose 仅检测更改图像的新版本,拉取它们,然后使用这些新图像重新启动服务。
我为此创建了一个简单的测试项目,其中唯一的目标是让版本 nr 在每次新构建时增加。如果我浏览到创建的 nginx 服务器,则会显示版本 nr(这在本地按预期工作)。
码头工人版本:1.11.2 码头工人撰写版本:1.7.1 操作系统:使用 docker-toolbox 在 CentOS 7 和 OS X 10.10 上测试
我的 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 服务器上,我运行以下命令来构建和标记图像
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
这似乎正在做它应该做的事情,因为每次构建完成并且版本 nr 被碰撞时,我都会在我们的存储库中获得一个新的版本标签。
如果我现在跑步
docker-compose pull && docker-compose -f docker-compose.yml up -d
在我计算机上的一个文件夹中,其中的内容只有 docker-compose.yml 和构建 nginx 和 php 服务所需的 Dockerfiles,我得到的输出不是注册表中标记的最新版本号或显示在 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 的预期行为吗?即我是否应该在再次运行up 之前始终执行docker-compose rm -f,即使在生产服务器上也是如此?还是我在这里做一些违背粮食的事情,这就是为什么它不起作用?
我们的目标是让我们的构建过程构建并创建 docker-compose.yml 中所需图像的标记版本,将它们推送到我们的私有注册表,然后“发布到生产步骤”以简单地复制 docker -compose.yml 到生产服务器并运行docker-compose pull && docker-compose -f docker-compose.yml up -d 以使新图像开始生产。如果有人对此有提示或可以指出此类设置的最佳实践教程,也将不胜感激。
【问题讨论】:
-
docker-compose up -d --force-recreate没用? -
为避免删除/重新创建容器时数据丢失的风险,请使用主机或命名卷。看起来您已经在为其他容器使用主机卷。当您第一次使用它时,一个空的命名卷将使用图像卷的内容进行初始化。
-
--force-recreated 不起作用,不 :( 我正在使用卷来存储数据,因此数据丢失部分可能不那么相关。但我仍然对拥有在重新启动容器之前做一个 docker-compose rm。不应该 up, 命令,特别是使用 force-recreate,注意通知一个新图像并使用它吗?我不得不强制感觉不对在生产服务器上删除
-
如果
--force-recreate没有重新创建容器,那么您可能需要在docker-compose上提交错误报告。请记住,使用新图像将重新创建容器,这将删除它。如果您在此过程中不删除任何特定于容器的卷,则可以在docker volume ls -f dangling=true中获得一个相当长的悬空数据列表,您将不再使用这些数据。所以你的修复是 docker-compose 应该为你做的前半部分。 -
好的,谢谢!我将不得不更多地摆弄以确保我了解该过程(在涉及 Docker 时仍然是新手),但看起来 docker-compose rm -f 在构建之前是我需要做的。
标签: docker build-process docker-compose