跳转至

Dive的使用

简介

docker inspect 命令可以查看一个 docker 镜像的 meta 信息,用 docker history 命令可以了解一个镜像的构建历史,但是这些信息对我们去分析一个镜像的具体一层的组成来说还是不太够,不够清晰明了

> docker inspect python:3.6.4
[
    {
        ......
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:8fad67424c4e7098f255513e160caa00852bcff347bc9f920a82ddf3f60229de",
                "sha256:86985c679800f423275a0ea3ad540e9b7f522dcdcd65ec2b20f407996162f2e0",
                "sha256:6e5e20cbf4a7246b94f7acf2a2ceb2c521e95daca334dd1e8ba388fa73443dfe",
                "sha256:ff57bdb79ac820da132ad1fdc1e2d250de5985b264dbdf60aa4ce83a05c4da75",
                "sha256:6e1b48dc2cccd7c0faf316e5975f1a02f5897723d7fa3b0367b28a20173931d6",
                "sha256:325a22db58ea59d76568ded2fac6b783554f8cd5fa8e851c260da4b141c55c6c",
                "sha256:a4a7a3673769ce5035e06f56458cab872bb5dc561bebe3571ac62fe2b52f0aaf",
                "sha256:c83faac49cbc38f1e458dfffb71b1c87860f56ac34602befefe6005177474ba3"
            ]
        },
        "Metadata": {
            "LastTagTime": "0001-01-01T00:00:00Z"
        }
    }
]
> docker history python:3.6.4
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
07d72c0beb99        8 months ago        /bin/sh -c #(nop)  CMD ["python3"]              0B
<missing>           8 months ago        /bin/sh -c set -ex;   wget -O get-pip.py 'ht…   6.06MB
<missing>           8 months ago        /bin/sh -c #(nop)  ENV PYTHON_PIP_VERSION=9.…   0B
<missing>           8 months ago        /bin/sh -c cd /usr/local/bin  && ln -s idle3…   32B
<missing>           8 months ago        /bin/sh -c set -ex  && buildDeps='   dpkg-de…   62.9MB
<missing>           8 months ago        /bin/sh -c #(nop)  ENV PYTHON_VERSION=3.6.4     0B
<missing>           8 months ago        /bin/sh -c #(nop)  ENV GPG_KEY=0D96DF4D4110E…   0B
<missing>           8 months ago        /bin/sh -c apt-get update && apt-get install…   8.67MB
<missing>           8 months ago        /bin/sh -c #(nop)  ENV LANG=C.UTF-8             0B
<missing>           8 months ago        /bin/sh -c #(nop)  ENV PATH=/usr/local/bin:/…   0B
<missing>           8 months ago        /bin/sh -c set -ex;  apt-get update;  apt-ge…   320MB
<missing>           8 months ago        /bin/sh -c apt-get update && apt-get install…   123MB
<missing>           8 months ago        /bin/sh -c set -ex;  if ! command -v gpg > /…   0B
<missing>           8 months ago        /bin/sh -c apt-get update && apt-get install…   44.6MB
<missing>           8 months ago        /bin/sh -c #(nop)  CMD ["bash"]                 0B
<missing>           8 months ago        /bin/sh -c #(nop) ADD file:bc844c4763367b5f0…   123MB

一个用来分析 docker 镜像层信息的一个工具:dive

该工具主要用于探索 docker 镜像层内容以及发现减小 docker 镜像大小的方法

项目地址

安装

直接使用 docker 镜像的方式,其他的安装方法在 dive 文档中查看即可

docker run --rm -it \
    -v /var/run/docker.sock:/var/run/docker.sock \
    wagoodman/dive:latest <dive arguments...>
# -e CI=true

使用

要分析一个 docker 镜像,只需要在 dive 工具后面添加上镜像的 tag 即可

dive <镜像TAG>

还可以通过 build 命令去构建 docker 镜像后,直接进入分析结果:

dive build -t <镜像TAG> .

如果想在 CI 中使用,则

CI=true dive <镜像TAG>

img

dive 提供功能如下:

  • 显示镜像每层的内容

dive 的命令行界面分成左右两边,左边是镜像的层数,通过选择不同的镜像层,可以在右边显示对应的目录树结构

此外,可以使用箭头按键来浏览整个文件树内容

  • 显示镜像每层的变更

通过选择对应的某一层,右边会根据不同的颜色标注该层文件的变化、修改、增加或者删除

  • 估算镜像的空间利用率

通过分析每层出现的重复文件数、跨不同层移动文件、没有完全删除的文件等,可分析出来镜像中存在的额外不必要的空间占比,通过这个占比可以不断去推动缩小镜像的大小

镜像大小的减少可以带来很直接的好处,比如镜像拉去快服务启动也快

  • 快速构建和分析的反馈环

可以构建 docker 镜像并使用一个命令立即进行分析:dive build -t some-tag .,只需要将 docker build 命令用相同的 dive build 命令替换即可

根据分析结果可快速作出是否需要优化的决策

  • 集成 CI

通过在 dive build 前面添加 CI=true 就可以集成到对应的流水线流程中,通过设置不同的空间利用率来控制镜像构建是否通过

  • 多种镜像源和容器引擎的支持

通过参数 --source 可以选择不同的镜像数据的格式源及不同容器的引擎

快捷键

快捷键 描述
Ctrl + C 推出
Tab 在图层和文件树视图之间切换
Ctrl + F 过滤文件
PageUp 向上翻页
PageDown 向下翻页
Ctrl + A 图层视图:查看聚合图像修改
Ctrl + L 图层视图:查看当前图层修改
Space Filetree 视图:折叠/取消折叠目录
Ctrl + Space Filetree 视图:折叠/取消折叠全部目录
Ctrl + A Filetree 视图: 显示/隐藏添加的文件
Ctrl + R Filetree 视图:显示/隐藏已删除的文件
Ctrl + M Filetree 视图:显示/隐藏已修改的文件
Ctrl + U Filetree 视图:显示/隐藏未修改的文件
Ctrl + B Filetree 视图:显示/隐藏文件属性
PageUp Filetree 视图:向上滚动页面
PageDown Filetree 视图:向下滚动页面