我已经在远程系统上设置了一个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命令会用较新的映像覆盖注册表上的现有映像。从逻辑上讲,如果我在目标系统上拉该映像,则希望该映像得到更新。但是实际上,我得到的图像已经过时了。
答案 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
标记与注册表中的最新图像无关!标记只是与图像关联的字符串:在这种情况下,该字符串由字母l
,a
,t
,e
,s
和t
组成,不一定表示标记是最新图片。 :latest
标签在两种情况下会被覆盖:
docker push
outserver.at:5000/karaf:latest
。docker push outserver.at:5000/karaf
。如果推送没有标签的图像(从而覆盖注册表中的latest
标签),然后推送新的图像但指定标签,则:latest
标签不会被覆盖,将指向第一个图像,而不是较新的图像。
最佳做法是始终指定图片标签:切勿使用:latest
标签。