在此前的两篇关于gitlab-ci的镜像的安全和质量的问题上做了一些简单的描述,现在就着此前的,我们在使用另外一个开源工具dive,使用dive用来对 镜像每个图层做分析,分析效率和镜像是否有浪费的空间,最后打印一个测试品质的报告。

此前在另外一篇文章如何从docker镜像恢复Dockerfile提到如何简单使用dive查看dockerfile.

阅读本章节,你将了解dive的基本使用和在gitlab-ci中的集成方式。我们先来看gitlab上作者给出的基本功能如下

描述#

显示按层细分的Docker镜像内容

当你在左侧选择一个图层时,将显示该图层的内容以及右侧的所有先前图层。此外,还可以使用箭头键完全浏览文件树(可以查看一些 dockerfile指令)。<当你使用dive image的时候你会进入一个交互式的接口>

指出每层中发生了哪些变化

已更改,已修改,添加或删除的文件在文件树中指示。可以调整此值以显示特定图层的更改,或直到此图层的聚合更改。

估算“镜像效率”

左下方窗格显示基本图层信息和一个实验指标,用于猜测镜像所包含的空间浪费。这可能是跨层重复文件,跨层移动文件或不完全删除文件。提供了百分比“得分”和总浪费的文件空间。

快速构建/分析周期

你可以构建Docker镜像并使用一个命令立即进行分析: dive build -t some-tag .

你只需要docker build使用相同的dive build 命令替换你的命令。

CI集成 分析和成像,并根据镜像效率和浪费的空间获得通过/失败结果。CI=true在调用任何有效的dive命令时,只需在环境中进行设置。

安装#

curl -OL https://github.com/wagoodman/dive/releases/download/v0.7.0/dive_0.7.0_linux_amd64.rpm 
rpm -i dive_0.7.0_linux_amd64.rpm
docker run --rm -i -v /var/run/docker.sock:/var/run/docker.sock  \
  -e CI=true   \
  wagoodman/dive:v0.7  registry.linuxea.com/dev/linuxeabbs:latest

使用#

我们主要围绕CI展开

如果要查看Dockerfile或者其他层的详情,可以使用dive IMAGE,参考如何从docker镜像恢复Dockerfile

[root@linuxea.com ~]# CI=true dive registry.linuxea.com/dev/linuxeabbs:latest
Fetching image... (this can take a while with large images)
Parsing image...
Analyzing image...
  efficiency: 99.6914 %
  wastedBytes: 1858891 bytes (1.9 MB)
  userWastedPercent: 0.5040 %
Run CI Validations...
  Using default CI config
  PASS: highestUserWastedPercent
  SKIP: highestWastedBytes: rule disabled
  PASS: lowestEfficiency
Result:PASS [Total:3] [Passed:2] [Failed:0] [Warn:0] [Skipped:1]

efficiency:这基本上是(总镜像大小)/(总和(所有层中的字节数))。我们的想法是,如果你不删除任何文件或添加任何文件两次,那么你的“效率”为100%。如果你开始复制/删除文件,则会根据效率计算(按浪费文件的大小加权)。 wastedBytes:发现在多个层上重复的原始字节数,或者发现在更高层中删除的原始字节数(因此,如果最终未使用,则可能不应该在任何层中。 userWastedPercent:这基本上是效率的倒数,除了不考虑基础镜像的任何修改。更具体地说,这是wastedBytes / sum(所有层中的字节,基本镜像层除外)。

集成到管道#

4/4 Docker_Dive:
  <<: *bash_init
  script:
    - Docker_Dive
  artifacts:
    name: "$CI_JOB_STAGE-$CI_COMMIT_REF_NAME"   
    paths: [Docker_Dive.log]    

函数部分

  function Docker_Dive() {
    export PROJECT_NAME=$(echo "$CI_PROJECT_PATH_SLUG" |awk -F- '{print $2}')
    export IMAGE_TAG_LATEST="$REPOSITORY_URL"/"$PROJECT_NAME":latest    
    docker run --rm -i -v /var/run/docker.sock:/var/run/docker.sock  -e CI=true \
      wagoodman/dive:v0.7 "$IMAGE_TAG_LATEST"  |tee Docker_Dive.log
  }  

部分截图如下: 20190327.png

延伸阅读#

阅读更多#