运维技术

Docker latest标签并没有什么不同

latest标签,由于它的字面意思是“最新的”,所以很多时候也容易被误解,其实latest就是个普通标签,不要期望它是最新或最稳定的版本。它只是个名字,没有其它附加作用,更不会自动更新。:)

Docker中,最容易产生误解的部分应该是latest这个标签。困惑主要是由于这个名字造成的,因为字面意思并不能表达它的真正含义。在本文中,我们来学习下latest标签的真正作用和如何正确使用它。

通常有两种方式来对镜像打标签:使用docker tag命令或者是在执行docker build的时候用-t来传递参数。在这两种情况下,参数的形式通常是repository_name:tag_name,例如:docker tag myrepo:mytag。如果这个资源库被上传到了Docker Hub,资源库的名字会加上一个由Docker Hub用户名和斜线组成的前缀,例如:amouat/myrepo:mytag。如果没有添加tag部分的参数,例如:docker tag myrepo:1.0 myrepo,Docker会自动的给它latest标签。前面这些内容或许你已经熟知,其实它也就这点内容,并没有什么神奇的地方。

不能因为镜像的标签是latest就认为这是资源库中最新的镜像。只有这个资源库的拥有者约定这样,拥有latest标签的镜像才一定是最新的镜像。例如,我可以轻易地把一个过时的镜像变成带有latest标签的镜像,例如:

  1. $ docker images myrepo
  2. REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
  3. myrepo              1.0                 2e9f372f03a0        44 seconds ago      2.433 MB
  4. myrepo              latest              2e9f372f03a0        44 seconds ago      2.433 MB
  5. myrepo              0.9                 4986bf8c1536        2 weeks ago         2.433 MB
  6. $ docker tag -f myrepo:0.9 myrepo:latest
  7. $ docker images myrepo
  8. REPOSITORY          TAG                 IMAGE ID            CREATED              VIRTUAL SIZE
  9. myrepo              1.0                 2e9f372f03a0        About a minute ago   2.433 MB
  10. myrepo              0.9                 4986bf8c1536        2 weeks ago          2.433 MB
  11. myrepo              latest              4986bf8c1536        2 weeks ago          2.433 MB

这里带latest标签的镜像与0.9版本的镜像是一样的,都是两周前的版本,然而1.0的镜像是一分钟以前的。

为什么这个标签让很多人迷惑,其实比较容易理解。‘just pull the latest image’ 这句话的意思是获取带有latest标签的镜像还是获取最新的镜像?这两者是否是一样呢?它们是不是资源库中最新的镜像呢?是不是最新的稳定版镜像或者是最新的开发版镜像呢?

更糟糕的是,很多人似乎认为latest标签会自动更新,也就是说如果我获取一个带有latest标签的镜像,Docker会在每次运行之前去检查它是不是最新的版本。这是绝对不会出现的情况,就像其它的标签一样,你需要去手工决定Docker获取最新版本的镜像。

困惑并不仅仅是这些。如果我从资源库docker pull一个镜像却没指定标签,会发生什么呢?如果你认为会获取下所有的镜像,那么就错了,它只会获取下来带有latest标签的那个。如果你需要获取全部镜像,需要加上-a标志。 如果你在资源库执行了pull操作,却没带latest标签,会发生什么呢?如下所示:

  1. $ docker pull amouat/myrepo
  2. Pulling repository amouat/myrepo
  3. 2015/01/21 12:04:06 Tag latest not found in repository amouat/myrepo

意料之中的是Docker给出了错误信息。但是我认为你不知道这其中发生了什么。

一个更令人讨厌的是latest标签隐藏了其它的标签,假设你要下载带latest标签的debian镜像。哪个是它的版本呢?

  1. $ docker images debian
  2. REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
  3. debian              latest              4d6ce913b130        4 days ago          84.98 MB

额,不知道。事实上是7.8 wheezy版本。

  1. $ docker pull debian:7.8
  2. debian:7.8: The image you are pulling has been verified
  3. 511136ea3c5a: Already exists
  4. d0a18d3b84de: Already exists
  5. 4d6ce913b130: Already exists
  6. Status: Image is up to date for debian:7.8
  7. $ docker pull debian:wheezy
  8. debian:wheezy: The image you are pulling has been verified
  9. 511136ea3c5a: Already exists
  10. d0a18d3b84de: Already exists
  11. 4d6ce913b130: Already exists
  12. Status: Image is up to date for debian:wheezy
  13. $ docker images debian
  14. REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
  15. debian              7.8                 4d6ce913b130        4 days ago          84.98 MB
  16. debian              latest              4d6ce913b130        4 days ago          84.98 MB
  17. debian              wheezy              4d6ce913b130        4 days ago          84.98 MB

我认为Docker在下载镜像时应该把所有的标签都带上,但是我不知道为什么它没有这么做。现在的情况是用户可以拥有同一个镜像的不同版本因为服务器上用标签来标示。例如:如果wheezylatest都在Hub上更新了,而我只获取了更新后的wheezy版本debian,那么尽管在Hub上他们可以被区分开,但是我的wheezy标签将会比本地的latest标签的版本新。

上述只是覆盖了latest的大部分语义以及它造成的常见误解。这种情况怎么能够改善呢?个人认为,可以取消latest标签并用一个更接近其字面意思的词来代替,例如default。我也希望可以看到一些改进标签原作方式的工作,例如同时更新一个镜像的全部标签。与此同时,我也强烈建议资源库管理员去警惕这个latest标签并彻底废弃它。

 

以上内容转载于:https://blog.csdn.net/whatday/article/details/102811821

确实有看到网上有文章说latest标签的Image会自动更新到被指定的最新版本,这很容易让人误解。那些文章还特意指出在Docker存在缓存的情况下也会自动检测本地latest版本与最新版本,不一致则自动更新,其实并没有这种行为。latest只是有特别含意的一个普通标签而已,在K8s中如果想每次拉取最新的包可以设置”“imagePullPolicy: Always“,在Docker中需要手动执行docker pull尝试拉取最新内容 

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注