如何让 docker-compose 使用存储库中的最新图像

新手上路,请多包涵

我不知道我做错了什么,但我根本无法让 docker-compose up 使用我们注册表中的最新映像,而无需先从系统中完全删除旧容器。即使 docker-compose pull 获取了更新的图像,compose 似乎也在使用之前启动的图像。

我查看了 如何让 docker-compose 始终从新图像重新创建容器? 这似乎与我的问题相似,但是那里提供的解决方案都不适合我,因为我正在寻找可以在生产服务器上使用的解决方案,并且我不想在启动它们之前删除所有容器再次(可能的数据丢失?)。我希望 compose 仅检测更改图像的新版本,拉取它们,然后使用这些新图像重新启动服务。

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

docker 版本:1.11.2 docker-compose 版本: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

在我们的詹金斯服务器上,我运行以下命令来构建和标记图像

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 以使新映像在生产中启动。如果有人对此有提示或可以指出这种设置的最佳实践教程,也将不胜感激。

原文由 Jens Wegar 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 440
2 个回答

为了结束这个问题,似乎有效的方法确实在运行

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

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

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

 docker-compose rm -f application nginx php

正如我在问题中所说,我不知道这是否是正确的过程。但这似乎适用于我们的用例,所以在我们找到更好的解决方案之前,我们将使用这个解决方案。

原文由 Jens Wegar 发布,翻译遵循 CC BY-SA 3.0 许可协议

为了确保您使用的是最新版本的 :latest 来自注册表(例如 docker hub)的标签,您还需要再次拉取最新的标签。万一它发生了变化,当您再次 docker-compose up 时,将下载并启动差异。

所以这将是要走的路:

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

我将它粘贴到我运行以启动 docker-compose 并确保图像保持最新的图像中: https ://hub.docker.com/r/stephanlindauer/docker-compose-updater/

原文由 stephanlindauer 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题