如何使docker-compose提取新图像?

时间:2018-11-27 10:28:12

标签: docker caching dockerfile

我在latest语句的Dockerfile中使用FROM标记:

# Dockerfile
FROM registry.website.com/base-image:latest

每次latest版本更改时,我都需要重新拉动该图像。

不幸的是,码头工人只是采用了缓存版本。

我尝试过

docker-compose build --no-cache

docker-compose up --build --force-recreate project

但是总是这样:

> docker-compose up --build --force-recreate project
Building project
Step 1/12 : FROM registry.website.com/base-image:latest
 ---> e2a0bcaf3dd7

有什么想法为什么不起作用?

谢谢

罗恩

4 个答案:

答案 0 :(得分:1)

这是docker run和类似命令的默认行为:如果您没有图像,它将拉出一个图像,但是如果有图像,它将假定您已有的图像是正确的。在这种情况下,由于图像未直接在docker-compose.yml文件中列出,因此您没有很多快捷方式;您可以编写类似

的脚本
sed -ne 's@^FROM \(.*/.*\)@\1@p' | xargs docker pull

拉出FROM行中列出的所有内容,但不拉取用于多阶段构建的基础图像(图像名称必须包含斜杠);这可能是过分的。

我已经看到一些避免使用latest标签的建议;这是两个重要原因之一(您也无法控制预打包软件的主要版本,也无法在多主机设置上进行一致的部署)。如果您使用持续集成设置来构建经常变化的图像,则可以考虑使用日期戳或构建ID对其进行标记,并将其放在FROM行中。您可以use an ARG使它更具可配置性,pass that through from docker-compose.yml最终可以返回到环境变量。

我猜想您可能无论如何都将使用shell脚本包装器,并且如果您设置为latest版本,它可能看起来像

#!/bin/sh
set -e
docker pull registry.website.com/base-image:latest
docker build -t ... .
docker-compose up -d

答案 1 :(得分:1)

我认为您正在寻找docker-compose pull

$ docker-compose help pull
Pulls images for services defined in a Compose file, but does not start the containers.

因此docker-compose pull && docker-compose up应该做您想做的事,而无需不断擦除撰写文件之外的缓存或硬编码容器名

答案 2 :(得分:1)

要重新拉取基础镜像并重新构建,请运行:

docker-compose build --pull

有关详细信息,请参阅 What's the purpose of "docker build --pull"

答案 3 :(得分:0)

好吧,一个不太好的手动解决方案如下:

docker image rm registry.website.com/base-image

希望有人有一个docker-compose解决方案。