理想情景:
我为现有的docker hub repo创建了一个新标记:
docker build . -t org/repo:v1
我有一个读取该标签的docker-compose:
version: '2'
services:
api:
image: org/repo
...
然而,这不起作用,因为没有最新的标签。
有没有办法解决这个问题?否则,每个部署都必须修改似乎很愚蠢的docker-compose.yml
。
我有一个丑陋的解决方案,但它有效: 我只需要重新标记并推送最新的标签。
docker tag org/repo:v1 org/repo:latest
docker push org/repo:latest
有更好的想法吗?
答案 0 :(得分:3)
请参阅The misunderstood Docker tag: latest
中的“Marc Campbell”:latest
是引用标记的标记:
最新版本只是一个带有特殊名称的标签。
除非您使用非常特定的构建/标记/推/拉/运行模式,否则它并不意味着什么特别。
“最新”仅表示“未指定特定标记/版本的最后一个构建/标记”。
换句话说,您可以构建这样的新版本:
sudo docker build -t marc/test . sudo docker tag marc/test marc/test:2 ... sudo docker build -t marc/test . sudo docker tag marc/test:3 ...
但这有点奇怪。为什么我要两次标记所有内容?
如果要将Docker镜像发送到生产环境,则应忽略
latest
标记 不要使用它。不要被它诱惑。
很容易看到它,并认为你的部署脚本应该只是拉“最新”,你的构建过程将确保它是有效的。做这项工作需要很多纪律。只需标记你的标签。每一次。
使用 Docker: The latest Confusion 中的“Adrian Mouat”查看详情:
如果要将存储库上载到Docker Hub,则存储库名称必须以斜杠和Docker Hub用户名为前缀,例如:
amouat/myrepo:mytag
。诀窍当然是,如果您将标记部分保留(例如
docker tag myrepo:1.0 myrepo
),Docker会自动为其标记latest
。
请参阅“How to create named and latest
tag in Docker?”。
仅仅因为图像被标记为最新,并不意味着它是其存储库中最新的图像。
那么如果你对没有最新标签的存储库进行拉动会发生什么? 这样:
$ docker pull amouat/myrepo Pulling repository amouat/myrepo 2015/01/21 12:04:06 Tag latest not found in repository amouat/myrepo
OP补充道:
我遇到的问题是尝试保持开发环境与最新更改同步,而无需每次更改时都使用新标记手动编辑docker-compose.yml。
为此,我总是维护一个“已部署”的标签,该标签正在移动(仅在我升级图像标签时应用)并在scripts / docker-compose.yml中使用。
我更喜欢构建自己的图像,以便add LABEL
s用于记忆“部署”标签实际引用的内容(我设置了一个名为“tag”的LABEL,其中包含实际的标签名称)。 / p>