1

我已经在远程系统上设置了一个 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 命令只用更新的图像覆盖注册表上的现有图像。从逻辑上讲,如果我在目标系统上拉取该图像,我希望该图像会被更新。但实际上,我得到的图像已经过时了。

4

2 回答 2

2

最佳实践通常是在您的docker run和类似的命令中明确:为每个映像构建使用唯一标签(如日期戳、源代码控制提交 ID 或构建号),在部署时使用该特定版本/构建号,不要依赖latest标签之类的东西。

这里的诀窍是,如果你docker run someimage:latestDocker 首先查看其本地图像列表。如果它已经有了具有确切名称和标签的东西,它就会运行它;如果没有,它将docker pull首先隐含。这也扩展到更高级别的编排系统(例如,您必须竭尽全力让 Kubernetes 强制它重新加载图像)。

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

于 2019-07-01T15:44:23.537 回答
-1

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

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

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

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

重要的:

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

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

如果你推送一个没有标签的镜像(从而覆盖latest注册表中的标签),然后推送一个更新的镜像但指定一个标签,那么:latest标签将不会被覆盖并且将指向第一个镜像,而不是新的镜像。

最佳做法是始终指定图像标签:永远不要使用:latest标签。

于 2019-07-01T15:40:31.243 回答