• 如何根据镜像反向生成Dockerfile内容?这三种方式总有一个适合你


    为什么需要反向生成Dockerfile内容

    【1】日常开发中,我们可以根据记录找到历史的docker镜像并进行操作,这个docker帮我们保存了,但是并没有一个好的方式去查看和保存构建者的Dockerfile文件内容。
    【2】知其然知其所以然;程序员都是有好奇心的,尤其对于docker这种新的技术,当我们去运行别人的镜像容器时,出于好奇心我想知道别人是如何构建,构建过程是什么,学习了解。
    【3】优化镜像;我们知道镜像是分层构建,如果我们想要优化一个镜像的大小和安全性,那么就需要去逐层解析和处理,这个就需要知道构建过程也就是Dockerfile是什么样的。
    【4】排查问题;当我们去使用别人提供的镜像时,因为不了解它的构建步骤和流程,那么可能缺少了一个组件,少配置了一个环境变量,那么在排查问题的时候就需要查看Dockfile分析排查问题了。

    实验准备

    FROM ubuntu:latest
    LABEL maintainer="example@gmail.com"
    RUN apt-get update && apt-get upgrade -y
    RUN apt-get install nginx -y
    EXPOSE 80
    CMD ["nginx", "-g", "daemon off;"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    上面的本次准备的一个测试的Dockerfile文件,构建命令如下

    docker build -t  simple-nginx .
    
    • 1

    docker history工具

    【语法】

    docker history [OPTIONS] IMAGE
    
    • 1

    在这里插入图片描述
    在这里插入图片描述
    docker history是docker自带的命令工具,一般情况下它可以满足我们查看构建过程的需求,但是有一些不足,它的整个展示的结果是逆序的和我们的Dockerfile是相反的,这意味着我们需要从下往上看,尤其命令比较长的话不是很友好。还有它删除了RUN命令,仅仅可以看到RUN命令后面的内容。如果我们想要去编辑这个Dockerfile内容也是不好操作的。

    alpine/dfimage工具

    alpine/dfimage是一个镜像,是由Whaler 工具构建而来的。主要功能有:
    【1】从一个docker镜像生成Dockerfile内容
    【2】搜索添加的文件名以查找潜在的秘密文件
    【3】提取Docker ADD/COPY指令添加的文件
    【4】展示暴露的端口、环境变量信息等等。

    它将自动提取目标docker镜像。参数-sV=1.36并不总是必需的。

    $ alias dfimage="docker run -v /var/run/docker.sock:/var/run/docker.sock --rm alpine/dfimage"
    $ dfimage -sV=1.36 nginx:latest
    
    • 1
    • 2

    示例:分析上面示例构建simple-nginx镜像,并写入一个临时文件中,非常的简单

    dfimage simple-nginx >  demo.text
    
    • 1

    以下就是输出的结果内容
    在这里插入图片描述

    dive工具

    如果想要更加详细的内容,比如每一层的信息,以及每一层对应的文件增减情况,那么dive工具可以帮助我们更好的分析镜像。
    dive用于探索docker镜像、layer内容和发现缩小docker/OCI镜像大小的方法的工具。对于一些优化镜像大小的需求,该工具将非常适用。
    【使用方式】

    $alias dive="docker run -ti --rm  -v /var/run/docker.sock:/var/run/docker.sock wagoodman/dive"
    $dive nginx:latest
    
    • 1
    • 2

    继续分析之前的测试镜像

    在这里插入图片描述
    左边是镜像和layer的信息,右边是当前选中镜像layer对应的文件磁盘文件信息,右边是会根据左边的选择变动的,比如我在某一层进行了文件的复制新增或者删除,右边会以不同的颜色进行展示的,具体展示如下:

    green  - 新增的文件
    yellow - 编辑的文件
    red    - 删除的文件
    
    • 1
    • 2
    • 3

    在这里插入图片描述
    在该启动状态下,我们可以通过tab键和上下键切换选择镜像层以及选择左边还是右边的内容,这对于镜像的分析非常有用。

  • 相关阅读:
    SpringBoot集成Spring Data JPA项目实操
    树状数组维护权值线段树
    js获取当前月第一天最后一天
    virtualbox配置_20211127
    Linux 环境搭建
    性能炸裂c++20协程+iocp/epoll,超轻量高性能异步库开发实战
    Java Web之Servlet技术
    springboot---优雅永不过时
    JDK线程池ThreadPoolExecutor源码总结
    【youcans动手学模型】目标检测之 SPPNet 模型
  • 原文地址:https://blog.csdn.net/Octopus21/article/details/126197093