关于Docker的一些事之镜像反推Dockerfile 您所在的位置:网站首页 镜像字是反的 关于Docker的一些事之镜像反推Dockerfile

关于Docker的一些事之镜像反推Dockerfile

#关于Docker的一些事之镜像反推Dockerfile| 来源: 网络整理| 查看: 265

一、为什么要镜像反推为Dockerfile?

当然是来源自我们工作中啦,在平日工作中,如果遇到容器方面的问题,是需要全方位的排查,如果缺少它的参与,一方面排查问题依据就是缺失一部分,另外一方面无法对出问题的容器进行针对性优化。

如果没有它,比如以下几个生产需求,就有可能会无法推进甚至失败

1、开发同学在日常利用docker开发应用的时候,他们可以根据记录找到对应历史的docker镜像并进行操作,而这个操作docker帮我们保管了,但是docker本身并没有非常好的查看保存构建者的Dockerfile文件内容的功能,如果突然出现了问题,尤其是容器内部工作环境的问题就显得力不从心了。

2、一些开发同学对容器方面有着浓厚的兴趣,当他们去运行别人的镜像容器时,出于学习,非常想了解别人是如何构建,构建过程是什么,但是由于镜像是docker封装的,如果无法查看,可能会失去借鉴他人经验的一个机会。

3、也是最核心的,与第一点是有联动之妙,是优化镜像以及排查问题方面,我们知道镜像是分层构建,若我们优化一个镜像的大小和安全性,那么就需要去逐层解析和处理,这个就需要知道构建过程也就是Dockerfile是什么样的;而我们去使用别人提供的镜像时,也会有一定的问题,可能会出现缺少了一个组件,少配置了一个环境变量等情况,这样的情况也需要根据Dockfile分析排查问题,如果无法查看,就无法针对性的调优。

二、既然如此重要,那么我们如何实现这个需求呢?

以我这边jenkins业务主机举一个案例吧

以sonarqube这个镜像来说吧,分析一下该镜像构建以及产出的Dockerfile过程。

下面我这边推荐两款工具,第一个docker history第二个是 alpine/dfimage仅供大家参考选择使用,个人强烈建议选择第二种,好用清爽不混乱,毫无压力哈哈哈。

先介绍第一款工具吧

1)docker history

这个工具是docker自带的,一般情况下它可以满足我们查看构建过程的需求,但是不会很完美,个人不推荐在生产、测试环境中使用。

先看下帮助信息吧,了解一下该工具的玩法

[root@jenkins-prod ~]# docker history --help Usage: docker history [配置] 镜像 # 基本格式 Show the history of an image Options: --help # 查看帮助 -H, --human # 以可读格式打印大小和日期 --no-trunc # 不截断输出 -q, --quiet # 仅显示数字ID

让我们实战一下测试看看

[root@jenkins-prod ~]# docker history d6a8d3467cda IMAGE CREATED CREATED BY SIZE COMMENT d6a8d3467cda 2 years ago /bin/sh -c #(nop) ENTRYPOINT ["./bin/run.... 0 B 2 years ago /bin/sh -c #(nop) USER sonarqube 0 B 2 years ago /bin/sh -c #(nop) COPY file:aa007fcc6be412... 1.01 kB 2 years ago /bin/sh -c #(nop) WORKDIR /opt/sonarqube 0 B 2 years ago /bin/sh -c #(nop) VOLUME [/opt/sonarqube/... 0 B 2 years ago /bin/sh -c set -x && cd /opt && cu... 265 MB 2 years ago /bin/sh -c for server in $(shuf -e ha.pool... 2.71 kB

因为是逆序排序,所以我们需要从下往上看,并且呢命令比较长的话不是很友好。还有它删除了RUN命令,仅仅可以看到RUN命令后面的内容。

从此,我们能看到,对推理出Dockerfile还是不友好的。

从此便引申出我们第二款工具啦~~

2) alpine/dfimage

这个工具是由Whaler 工具构建而来,它可以比较全面的展示一个镜像的构建过程,对比 docker history 来说,还是非常友好的。

这个工具优势还是很明显的,比如:

从一个docker镜像生成Dockerfile内容搜索添加的文件名 以查找潜在的秘密文件提取Docker ADD/COPY指令添加的文件展示暴露的端口、环境变量信息等等。

还有很多,这里就不一一细说了。

使用方法如下

# 定义底层工作镜像 [root@jenkins-prod ~]# alias dfimage="docker run -v /var/run/docker.sock:/var/run/docker.sock --rm alpine/dfimage" # 进行Dockerfile查询 [root@jenkins-prod ~]# dfimage -sV=1.36 docker.io/sonarqube(此处为镜像的名称,不是镜像ID) ...... cb4d01bc5fb2: Pull complete Digest: sha256:d01fc01edd48c0fcdd8841255cfc30eb05b43e160b4c1b9056ca0c75d32ac285 Status: Downloaded newer image for docker.io/sonarqube:latest Analyzing docker.io/sonarqube Docker Version: 20.10.12 GraphDriver: overlay2 Environment Variables |PATH=/opt/java/openjdk/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin |LANG=en_US.UTF-8 |LANGUAGE=en_US:en |LC_ALL=en_US.UTF-8 |JAVA_HOME=/usr/lib/jvm/java-17-openjdk |SONARQUBE_HOME=/opt/sonarqube ... ...

对比一下docker history,结果更加清晰直观,便于我们阅读理解,当然小伙伴会问,可以保存在本地查看嘛?

是的!当然可以啦!

可以将结果生成为txt文档,便于收集查看

你只需要做到以下这点就OK啦

[root@jenkins-prod ~]# dfimage docker.io/sonarqube > demo.text [root@jenkins-prod ~]# cat demo.text Analyzing docker.io/sonarqube Docker Version: 20.10.12 GraphDriver: overlay2 Environment Variables |PATH=/opt/java/openjdk/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin |LANG=en_US.UTF-8 |LANGUAGE=en_US:en |LC_ALL=en_US.UTF-8 |JAVA_HOME=/usr/lib/jvm/java-17-openjdk |SONARQUBE_HOME=/opt/sonarqube |SONAR_VERSION=9.8.0.63668 |SQ_DATA_DIR=/opt/sonarqube/data |SQ_EXTENSIONS_DIR=/opt/sonarqube/extensions |SQ_LOGS_DIR=/opt/sonarqube/logs |SQ_TEMP_DIR=/opt/sonarqube/temp

发现洞察结果已经生成一个名为demo.txt的文件了,特别简单粗暴有木有?哈哈哈!

从而前面几个生产需求,也就轻轻松松地就搞定了,再也不用担心啦!



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有