Docker 注册表不会更新映像



>我在远程系统上设置了一个 docker 注册表。我已经将一些图像推送到它。我已经对这些图像进行了更改,并希望更新这些图像,以便在拉取它们时获得最新版本。如何保证始终获得最新版本?

我试图用 :latest 标记我的图像,但这似乎没有任何作用。我还确保使用 --no-cache 标志重新构建映像。

这是我目前所做的:

我通过以下方式构建映像

docker image build --tag karaf .

我用标记该图像

docker image tag karaf outserver.at:5000/karaf

我用

docker push outserver.at:5000/karaf

我通过以下方式在某个目标系统上拉取图像

docker pull outserver.at:5000/karaf

我启动我的 docker-compose 文件,该文件将这些图像作为服务

docker-compose up

我希望 push 命令只是用较新的映像覆盖注册表上的现有映像。从逻辑上讲,如果我在目标系统上拉取该映像,我希望该映像得到更新。但实际上,我得到的图像已经过时了。

最佳做法通常是在docker run和类似命令中明确:为每个映像生成(如日期戳、源代码管理提交 ID 或内部版本号)使用唯一标记,在部署时使用该特定版本/内部版本号,并且不要依赖latest标记之类的内容。

这里的诀窍是,如果你docker run someimage:latest,Docker首先查看其本地映像列表。 如果它已经具有具有该确切名称和标签的内容,它就会运行它;如果没有,它将首先隐式docker pull。 这也扩展到更高级别的编排系统(例如,你必须走得很远才能让 Kubernetes 强制它重新加载图像)。

在 Docker Compose 的情况下,docker-compose up尝试使系统进入预期状态,并执行必要的最少工作。 如果更改应用程序容器上的标记,则docker-compose up将删除并重新创建该容器,而不会接触数据库容器。 除了正在执行的手动docker pull之外,docker-compose stop app; docker-compose rm app可能需要强制重建一个容器。

如果您的 push 命令确实有效并且您成功地将新映像推送到注册表,那么像您正在执行的那样拉取映像将起作用,您最终会得到更新的映像。

检查(通过查看返回代码)推送是否成功(下图显示 Bash):

> docker push outserver.at:5000/karaf
> echo $?

如果您没有看到此信息,请向我们展示构建、标记、推送和拉取步骤的控制台消息。

重要:

请注意,:latest标记与注册表中的最新映像无关!标签只是与图像关联的字符串:在这种情况下,字符串由字母latest组成,并不一定意味着标签是最新的图像。:latest标记在两种情况下被覆盖:

  1. 您在推送时明确使用该标签,例如docker push outserver.at:5000/karaf:latest.
  2. 您根本不指定标签,例如docker push outserver.at:5000/karaf.

如果推送没有标记的映像(从而覆盖注册表中的latest标记),然后推送较新的映像但指定标记,则不会覆盖:latest标记,并且将指向第一个映像,而不是较新的映像。

最佳做法是始终指定图像标记:切勿使用:latest标记。

最新更新