管理docker hub映像版本的正确方法

时间:2018-05-19 21:41:10

标签: docker

理想情景:

我为现有的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

有更好的想法吗?

1 个答案:

答案 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 LABELs用于记忆“部署”标签实际引用的内容(我设置了一个名为“tag”的LABEL,其中包含实际的标签名称)。 / p>