如何从docker镜像恢复Dockerfile

2023年 7月 16日 72.5k 0

docker101.png有这么两个场景:

1,当我丢失了原本的Dockfile,我希望找回Dockerfile,但是我只有镜像

2,我希望知道一个镜像中的Dockfile详情

鉴于此,我找到了几种解决方案,大致可以复现出Dockfile的很大一部分的内容,如下:

我们有必要了解docker history ,但是仅仅使用docker history --no-trunc是无法提取完整

  • docker环境
[root@linuxea.com ~]# docker version
Client:
 Version:           18.06.1-ce
 API version:       1.38
 Go version:        go1.10.3
 Git commit:        e68fc7a
 Built:             Tue Aug 21 17:23:03 2018
 OS/Arch:           linux/amd64
 Experimental:      false

Server:
 Engine:
  Version:          18.06.1-ce
  API version:      1.38 (minimum version 1.12)
  Go version:       go1.10.3
  Git commit:       e68fc7a
  Built:            Tue Aug 21 17:25:29 2018
  OS/Arch:          linux/amd64
  Experimental:     false

Dive

Dive用于发现docker镜像,镜像层内容以及发现缩小Docker镜像大小的方法的工具。

要分析Docker镜像,只需使用图像标记/ id / digest运行潜水:

dive <your-image-tag>

或者如果你想建立新的,那么直接跳到分析它:

dive build -t <some-tag> .

建立在Macbook上

docker run --rm -it 
      -v /usr/local/bin/docker:/bin/docker 
      -v /var/run/docker.sock:/var/run/docker.sock 
      -v  "$(pwd)":"$(pwd)" 
      -w "$(pwd)" 
      -v "$HOME/.dive.yaml":"$HOME/.dive.yaml" 
      wagoodman/dive:latest build -t <some-tag> .

rpm安装

curl -OL https://github.com/wagoodman/dive/releases/download/v0.6.0/dive_0.6.0_linux_amd64.rpm 
rpm -i dive_0.6.0_linux_amd64.rpm

Dive查看Dockerfile

使用dive marksugar/redis:5.0.0 即可查看,如下图中。相信你也看到了,这里的内容不止于此20190214.png

Dive CI

此外,您可以在CI管道中运行此命令,以确保将浪费的空间保持在最低限度(这会跳过UI):

CI=true dive <your-image>

ok,我们本来是看Dockfile的,但是也不妨测试一下镜像的质量使用CI=true dive marksugar/redis:5.0.020190214-1.png

bash解决方案

我们看一下效果20190214-2.png

脚本如下:

#!/bin/bash
#########################################################################
# File Name: dockerfile.sh
# Author: www.linuxea.com
# Version: 1
# Created Time: Thu 14 Feb 2019 10:52:01 AM CST
#########################################################################
case "$OSTYPE" in
    linux*)
        docker history --no-trunc --format "{{.CreatedBy}}" $1 | # extract information from layers
        tac                                                    | # reverse the file
        sed 's,^(|3.*)?/bin/(ba)?sh -c,RUN,'             | # change /bin/(ba)?sh calls to RUN
        sed 's,^RUN #(nop) *,,'                                | # remove RUN #(nop) calls for ENV,LABEL...
        sed 's,  *&&  *, \n && ,g'                           # pretty print multi command lines following Docker best practices
    ;;
    darwin*)
        docker history --no-trunc --format "{{.CreatedBy}}" $1 | # extract information from layers
        tail -r                                                | # reverse the file
        sed -E 's,^(|3.*)?/bin/(ba)?sh -c,RUN,'               | # change /bin/(ba)?sh calls to RUN
        sed 's,^RUN #(nop) *,,'                                | # remove RUN #(nop) calls for ENV,LABEL...
        sed $'s,  *&&  *, \ \n && ,g'                      # pretty print multi command lines following Docker best practices
    ;;
    *)
        echo "unknown OSTYPE: $OSTYPE"
    ;;
esac

分步说明:

docker history --no-trunc --format "{{.CreatedBy}}" $1        从镜像层中提取信息
tac                                                           反转文件
sed 's,^(|3.*)?/bin/(ba)?sh -c,RUN,'                    修改shell调用run的操作
sed 's,^RUN #(nop) *,,'                                        '删除/bin/sh调用ENV,LABEL等
sed 's,  *&&  *, \n && ,g                               以更易读的方式打印

此运行 bash dockerfile2.sh CONTAINER_NAME即可,如:

[root@linuxea.com ~]# bash dockerfile2.sh  marksugar/redis:5.0.0

学习更多

学习如何使用Docker CLI命令,Dockerfile命令,使用这些命令可以帮助你更有效地使用Docker应用程序。查看Docker文档和我的其他帖子以了解更多信息。

  • docker目录
  • 白话容器
  • docker-compose

相关文章

LeaferJS 1.0 重磅发布:强悍的前端 Canvas 渲染引擎
10分钟搞定支持通配符的永久有效免费HTTPS证书
300 多个 Microsoft Excel 快捷方式
一步步配置基于kubeadmin的kubevip高可用
istio全链路传递cookie和header灰度
REST Web 服务版本控制

发布评论