Docker注册表不会更新映像

时间:2019-07-01 15:06:35

标签: bash docker docker-registry

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

2 个答案:

答案 0 :(得分:1)

最佳做法通常是在您的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来强制重建一个容器。

答案 1 :(得分:0)

如果您的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标签。

相关问题