docker image tag为什么出现none

背景

公司项目是基于容器化架构设计,具体业务也拆成了多个微服务及对应了多个docker image镜像。研发环境中会频繁进行升级image镜像,导致出现很多image为 <none> 命名的镜像,这种也称为悬空镜像。

docker image tag为什么出现none

本篇文章将展示几种现象会导致这种情况发生。
下文演示环境,版本信息如下:

  • Centos8
  • docker server: 23.0.1
  • docker client: 20.10.17
  • containerd: 1.6.18
  • runc version: 1.1.4

现象一

docker image tag为什么出现none

前提条件:在同环境中两个镜像名称:tag都相同,image层数据内容不一致,覆盖后则会出现 <none> 标志。
注意:如果仅是镜像名称:tag相同则不会覆盖,也不会出现 <none> 标志。 因为image层数据没有发生变化,docker认为是同一个镜像。

[root@k8s-host docker]# cat > Dockerfile << EOF
> FROM alpine:latest
> ADD test.txt /root
> EOF
[root@k8s-host docker]# echo 1 > test.txt
[root@k8s-host docker]# docker build -t alpine1:v1.0 .
[+] Building 0.1s (7/7) FINISHED                                                                                                                                    
 => [internal] load build definition from Dockerfile                                                                                                           0.0s
 => => transferring dockerfile: 134B                                                                                                                           0.0s
 => [internal] load .dockerignore                                                                                                                              0.0s
 => => transferring context: 2B                                                                                                                                0.0s
 => [internal] load metadata for docker.io/library/alpine:latest                                                                                               0.0s
 => [internal] load build context                                                                                                                              0.0s
 => => transferring context: 96B                                                                                                                               0.0s
 => CACHED [1/2] FROM docker.io/library/alpine:latest                                                                                                          0.0s
 => [2/2] ADD test.txt /root                                                                                                                                   0.0s
 => exporting to image                                                                                                                                         0.0s
 => => exporting layers                                                                                                                                        0.0s
 => => writing image sha256:aa416b5c47216b392755ba2b4ad08f5531f3aa86c103744e261e49ce7a354021                                                                   0.0s
 => => naming to docker.io/library/alpine1:v1.0                                                                                                                0.0s
 [root@k8s-host docker]# docker images
REPOSITORY                                TAG       IMAGE ID       CREATED          SIZE
alpine1                                   v1.0      aa416b5c4721   30 seconds ago   7.34MB

该镜像是基于alpine:latest镜像进行二次编译。
Dockerfile中仅增加 test.txt 用来区分层内容

FROM alpine:latest
ADD test.txt /root

上述步骤中执行 docker images 可以看到 alpine1:v1.0 已经存在镜像ID aa416b5c4721 的容器镜像。下面继续编译镜像,名字与 alpine1:v1.0 相同,仅仅将Dockerfile中 test.txt 文件内容修改。进行第二次加载镜像,此时系统已存在相同的镜像名称。

[root@k8s-host docker]# echo 2 > test.txt 
[root@k8s-host docker]# docker build -t alpine1:v1.0 .
[+] Building 0.1s (7/7) FINISHED                                                                                                                                    
 => [internal] load build definition from Dockerfile                                                                                                           0.0s
 => => transferring dockerfile: 134B                                                                                                                           0.0s
 => [internal] load .dockerignore                                                                                                                              0.0s
 => => transferring context: 2B                                                                                                                                0.0s
 => [internal] load metadata for docker.io/library/alpine:latest                                                                                               0.0s
 => [internal] load build context                                                                                                                              0.0s
 => => transferring context: 96B                                                                                                                               0.0s
 => CACHED [1/2] FROM docker.io/library/alpine:latest                                                                                                          0.0s
 => [2/2] ADD test.txt /root                                                                                                                                   0.0s
 => exporting to image                                                                                                                                         0.0s
 => => exporting layers                                                                                                                                        0.0s
 => => writing image sha256:e4159797272a190d20856475858bab23d11e64d6bdd9a57ca8a85ad3c3a17087                                                                   0.0s
 => => naming to docker.io/library/alpine1:v1.0                                                                                                                0.0s
[root@k8s-host docker]# docker images
REPOSITORY                                TAG       IMAGE ID       CREATED          SIZE
alpine1                                   v1.0      e4159797272a   3 seconds ago    7.34MB
<none>                                    <none>    aa416b5c4721   6 minutes ago    7.34MB

原来的 alpine1:v1.0 镜像ID为 aa416b5c4721 的docker镜像目前属于 <none> 标记,这是因为有了新的镜像名称相同造成。虽然是<none>标记,如果之前有引用的容器仍然可以使用。
注意:如果将 alpine1:v1.0 镜像ID为 e4159797272a 的docker镜像删除, 下面的<none>标记也不会发生变化。只有当时的 Dockerfile中的 ADD 文件重新docker build -t alpine1:v1.0编译,此处的 <none> 标记才能显示正常。

现象二

docker save 时镜像没有指定镜像名称:tag,而是使用的镜像ID。

[root@k8s-host docker]# docker images
REPOSITORY                                TAG       IMAGE ID       CREATED          SIZE
alpine1                                   v1.0      e4159797272a   3 seconds ago    7.34MB
[root@k8s-host docker]# docker save e4159797272a | gzip > alpine1.docker
[root@k8s-host docker]# docker rmi e4159797272a
Untagged: alpine1:v1.0
Deleted: sha256:e4159797272a190d20856475858bab23d11e64d6bdd9a57ca8a85ad3c3a17087
[root@k8s-host docker]# docker load < alpine1.docker 
Loaded image ID: sha256:e4159797272a190d20856475858bab23d11e64d6bdd9a57ca8a85ad3c3a17087
[root@k8s-host docker]# docker images
REPOSITORY                                TAG       IMAGE ID       CREATED          SIZE
<none>                                    <none>    e4159797272a   21 minutes ago   7.34MB操作中,将alpine1:v1.0镜像没有按照镜像:tag方式 save,而是使用 docker save e4159797272a 镜像ID格式保存, 仅仅微小的变化会导致镜像加载时的效果不同。当执行完 docker load < alpine1.docker  加载镜像后发现,此时的镜像ID还是原来没有变化,而镜像名称:TAG 都变成<none>。注意:如果 docker save 导出镜像时不指定 镜像名称:tag 这种方式,在docker load 加载镜像时会丢失镜像名称和tag标记。现象三正运行的容器所引用的镜像,将其强行删除镜像docker images会出现<none>标记。[root@k8s-host docker]# docker images
REPOSITORY                                TAG       IMAGE ID       CREATED         SIZE
alpine4                                   v1.0      7ea0f12a3321   7 hours ago     7.34MB
[root@k8s-host docker]# docker rmi alpine4:v1.0
Error response from daemon: conflict: unable to remove repository reference "alpine4:v1.0" (must force) - container 945e9f47d833 is using its referenced image 7ea0f12a3321
[root@k8s-host docker]# docker rmi -f alpine4:v1.0
Untagged: alpine4:v1.0
[root@k8s-host docker]# docker ps -a | grep alpine
945e9f47d833   7ea0f12a3321   "/bin/sh -c 'tail -f…"   54 seconds ago   Up 53 seconds             alpine4
[root@k8s-host docker]# docker images
REPOSITORY                                TAG       IMAGE ID       CREATED         SIZE
<none>                                    <none>    7ea0f12a3321   7 hours ago     7.34MB

操作中执行 docker rmi -f alpine4:v1.0 命令后,仅删除了镜像名称:tag,并没有删除镜像数据层。可以看到只有镜像名称:tag 变成了<none>,实际的镜像还是存在的。因为目前 945e9f47d833 容器中引用到了 7ea0f12a3321 镜像是无法使用 docker rmi -f 删除的。

扩展内容

尤其在测试、研发环境中会出现很多 <none> 标记的镜像,占用较多资源。 在docker cli工具中可以使用如下命令来清理未使用的镜像。

$ docker system prune

注意:该命令包含删除所有未使用的容器、网络、镜像(悬空的和未引用的),以及卷(可选)。

也可单独删除所有无名的镜像(悬空镜像)

$ docker rmi $(docker images -f "dangling=true" -q)

文章来源:https://www.cnaaa.net,转载请注明出处:https://www.cnaaa.net/archives/9878

(0)
凯影的头像凯影
上一篇 2023年10月19日 下午4:12
下一篇 2023年10月20日 下午4:58

相关推荐

  • CDN 加速 – 隐藏真实 IP – 复活 IP

    CDN 一词相信很多朋友都不会陌生,网上也经常会看到相关报道。或许大部分人都知道 CDN 加速可以提升网站的打开速度及用户下载资源的速度,而同时也有不少朋友还不清楚 CDN 是什么?有什么用途?它是如何实现加速的呢?下面为大家整理了一些通俗易懂的知识点。 CDN 是什么 CDN 的全称:CONTENT DELIVERY NETWORK,即 内容分发…

    2023年11月9日
    57500
  • Python爬虫进阶:爬取在线电视剧信息与高级检索

    简介:        本文将向你展示如何使用Python创建一个能够爬取在线电视剧信息的爬虫,并介绍如何实现更高级的检索功能。我们将使用requests和BeautifulSoup库来爬取数据,并使用pandas库来处理和存储检索结果。 一、爬取在线电视剧信息 首先,我们需要找到一个提供电视剧信息的网站,并确保我们可以合法地爬取这些数据。 代码实现: 二、实…

    2024年2月27日
    1.3K00
  • Windows2008安装IIS方法图文教程

    1、右键点击 “计算机”,在弹出菜单中选择“管理”选项,在服务器管理器左侧界面 点击 “角色”选项,如下图: 2、点击“添加角色”按钮后,弹出如下界面 3、选择“角色”列表中的“Web服务器(IIS)”和“应用程序服务器”,点击“下一步” 点击“添加必须的功能”按钮后,进行下一步操作: 点击“下一步” 点击“下一步” 安装完成后,点击下图中的“关闭”按钮完成…

    2022年6月22日
    93000
  • 如何修改ftp服务器密码,ftp密码,3种修改ftp密码的方法

    大家好,又见面了,我是你们的朋友全栈君。 其实FTP服务就相当于共享文件,你要进入FTP服务器首先要知道提供FTP这台电脑的IP或者域名。FTP服务器是可以随意设置访问的用户名和密码的,当然也可以设置匿名访问(设置了匿名访问,用户就不需要输用户名和密码了) IIS7服务器管理工具可以批量管理、定时上传下载、同步操作、数据备份、到期提醒、自动更新。IIS7服务…

    2024年7月2日
    1.8K00
  • Ubuntu创建和删除用户

    Ubuntu与其他Linux发行版一样,是一个多用户操作系统。每个用户可以具有不同的权限级别和各种命令和GUI应用程序的特定设置。 了解如何添加和删除用户是Linux用户应该了解的基本技能之一。为能够创建和删除用户,您需要以root或具有sudo权限的用户登录。 在Ubuntu中添加用户方式有两种,第一种是使用adduser或者useradd命令。第二种通过…

    2023年3月10日
    99300

发表回复

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

在线咨询: QQ交谈

邮件:712342017@qq.com

工作时间:周一至周五,8:30-17:30,节假日休息

关注微信