我在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
有什么想法为什么不起作用?
谢谢
罗恩
答案 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
解决方案。