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

时间:2016-06-07 17:24:20

标签: docker build-process docker-compose

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

我查看了How to get docker-compose to always re-create containers from fresh images?这似乎与我的问题相似,但是我提供的解决方案都没有对我有用,因为我正在寻找一种可以在生产服务器上使用的解决方案不希望在再次启动容器之前删除所有容器(可能的数据丢失?)。我想仅仅为了检测已更改图像的新版本,拉出它们然后用这些新图像重新启动服务。

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

docker version: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

在我们的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的预期行为吗?即在生产服务器上再次运行docker-compose rm -f之前,我是否应始终执行up?或者我在这里做点什么,这就是为什么它不起作用?

目标是让我们的构建过程构建并创建docker-compose.yml中所需图像的标记版本,将它们推送到我们的私有注册表,然后将“发布到生产步骤”简单地复制到docker -compose.yml到生产服务器并运行docker-compose pull && docker-compose -f docker-compose.yml up -d以使新映像在生产中启动。如果有人有这方面的提示或者可以指出这种设置的最佳实践教程,也会非常感激。

13 个答案:

答案 0 :(得分:24)

为了确保您使用注册表中:latest标记的最新版本(例如docker hub),您还需要再次提取最新标记。如果它发生了变化,则会在你再次docker-compose up时下载并启动差异。

所以这就是要走的路:

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

我将其粘贴到一张图片中,我开始使用这个图片来确保图片保持最新状态:https://hub.docker.com/r/stephanlindauer/docker-compose-updater/

答案 1 :(得分:15)

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

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

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

答案 2 :(得分:15)

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

我使用下面的命令,实际上是3合1

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

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

答案 3 :(得分:11)

自 2020-05-07 起,docker-compose 规范还为服务定义了“pull_policy”属性:

version: '3.7'

services:
  my-service:
    image: someimage/somewhere
    pull_policy: always

docker-compose spec 说:

pull_policy defines the decisions Compose implementations will make when it starts to pull images.

可能的值是(tl;dr,查看规范以获取更多详细信息):

  • 总是:总是拉
  • never:不拉(如果找不到图像则中断)
  • missing:如果图像未缓存则拉取
  • 构建:始终构建或重建

答案 4 :(得分:8)

即使我的容器正在运行并且它更新得很好,我也会使用以下内容。

docker-compose pull
docker-compose up -d

答案 5 :(得分:3)

我花了半天时间解决这个问题。原因是一定要检查记录音量的位置。

卷: -api-data:/ src / patterns

但是事实是,在这里是我们更改的代码。但是在更新docker时,代码没有更改。

因此,如果您正在检查别人的代码,并且由于某种原因未在更新,请选中此选项。

因此,通常这种方法有效:

docker-compose down

docker-compose build

docker-compose up -d

答案 6 :(得分:1)

我见过这种情况发生在我们的7-8码头生产系统中。 在生产中对我有用的另一个解决方案是运行

docker-compose down
docker-compose up -d

这会删除容器,并且似乎从最新的图像中“up”创建新的容器。

这还没有解决我的每个EACH更改容器的降低+上升的梦想(连续,减少停机时间),但它可以强制'up'更新容器。

答案 7 :(得分:0)

'up'命令的docker-compose文档清楚地指出,如果自上次“up”以来图像被更改,它会更新容器。演出:

  

如果服务存在现有容器,并且在创建容器后更改了服务的配置或映像,则 docker-compose up 通过停止并重新创建容器来获取更改(保留已安装的卷) )。

所以通过使用' stop'接下来是“拉”'然后' up'因此,应该避免运行容器丢失卷的问题,当然,对于已更新映像的容器除外。

我目前正在尝试这个过程,并且很快就会在此评论中包含我的结果。

答案 8 :(得分:0)

选项function function1(){ function2(); } function function2() { console.log('called by function' + function2.caller.name); console.log('the function who called me is ...'); } function1();解决了此问题

我运行我的撰写文件:

down

然后我用docker-compose -f docker/docker-compose.yml up -d

全部删除

down --rmi all

docker-compose -f docker/docker-compose.yml down --rmi all

答案 9 :(得分:0)

我正在使用以下命令来获取最新图像

sudo docker-compose down -rmi all

sudo docker-compose up -d

答案 10 :(得分:0)

如果docker compose配置位于文件中,只需运行:

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

答案 11 :(得分:0)

但是

https://docs.docker.com/compose/reference/up/ -quiet-pull拉而无需打印进度信息

docker-compose up --quiet-pull

不起作用?

答案 12 :(得分:-1)

我将Abhi的脚本进一步扩展了如下

export composeFile="docker-compose.test.yml"
docker-compose -f  $composeFile down 
docker-compose -f  $composeFile pull 
docker-compose -f  $composeFile up -d