如何让 docker-compose 拉取新镜像?

Ron*_*Ron 12 caching docker dockerfile

latestDockerfileFROM声明中使用了标签:

# Dockerfile
FROM registry.website.com/base-image:latest
Run Code Online (Sandbox Code Playgroud)

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

不幸的是,docker 只采用缓存版本。

我试过

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
Run Code Online (Sandbox Code Playgroud)

任何想法为什么它不起作用?

Kri*_*ass 19

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

$ docker-compose help pull
Pulls images for services defined in a Compose file, but does not start the containers.
Run Code Online (Sandbox Code Playgroud)

所以docker-compose pull && docker-compose up应该做你想做的事,而不需要在你的撰写文件之外不断擦除你的缓存或硬编码容器名称

  • 它没有达到作者的要求。它拉取服务的镜像,但不拉取 Dockerfiles 中 FROM 中指定的基础镜像 (3认同)
  • 这怎么不被接受的答案?完全符合问题的要求。谢谢! (2认同)

Dav*_*aze 5

这是类似命令的默认行为docker run:如果您还没有图像,它将拉取图像,但如果您这样做了,它会假设您已经拥有的图像是正确的。在这种情况下,由于图像没有直接列在docker-compose.yml文件中,因此您没有很多快捷方式;你可以编写类似的脚本

sed -ne 's@^FROM \(.*/.*\)@\1@p' | xargs docker pull
Run Code Online (Sandbox Code Playgroud)

提取一行中列出的所有内容FROM,但不提取多阶段构建的基础映像(映像名称必须包含斜杠);这可能有点矫枉过正了。

我看到了一些避免使用latest标签的建议;这是几个重要原因之一(您也无法控制预打包软件的主要版本,并且无法在多主机设置上获得一致的部署)。如果您有一个持续集成设置来构建经常更改的映像,您可以考虑使用日期戳或构建 ID 来标记它,并将其放入行中FROM。您可以使用 anARG使其更具可配置性,并将其通过 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
Run Code Online (Sandbox Code Playgroud)