>我在远程系统上设置了一个 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
标记与注册表中的最新映像无关!标签只是与图像关联的字符串:在这种情况下,字符串由字母l
、a
、t
、e
、s
和t
组成,并不一定意味着标签是最新的图像。:latest
标记在两种情况下被覆盖:
- 您在推送时明确使用该标签,例如
docker push outserver.at:5000/karaf:latest
. - 您根本不指定标签,例如
docker push outserver.at:5000/karaf
.
如果推送没有标记的映像(从而覆盖注册表中的latest
标记),然后推送较新的映像但指定标记,则不会覆盖:latest
标记,并且将指向第一个映像,而不是较新的映像。
最佳做法是始终指定图像标记:切勿使用:latest
标记。