Open zshuangyan opened 6 years ago
有时候构建镜像可能是一个逐步优化逐步迭代的过程,我们会以之前构建的镜像为基础镜像,然后再在上面添加一些操作或者文件。但是恰好我们又忘记对镜像文件的代码进行版本管理,而最新版本的镜像文件Dockerfile里边只能看到依赖的老镜像和寥寥的几个命令,那么怎样还原出这个镜像完整的操作命令呢? 我们可以通过逆向迭代查找到镜像的母镜像链,然后查看这个链上的每个镜像对它的母镜像做了哪些修改,下面这个shell脚本可以满足我们的需求: trace_cmd.sh
function dc_trace_cmd() { local parent=`docker inspect -f '{{ .Parent }}' $1` 2>/dev/null declare -i level=$2 echo ${level}: `docker inspect -f '{{ .ContainerConfig.Cmd }}' $1 2>/dev/null` level=level+1 if [ "${parent}" != "" ]; then echo ${level}: $parent dc_trace_cmd $parent $level fi } dc_trace_cmd $1
然后我们执行下面的命令就可以看到迭代的过程了
./trace_cmd.sh <image_name:version>
例如,查看我的memory-predict:0.9镜像的迭代过程
[zhangshuangyan@gs-server-3238 ~]$ ./trace_cmd.sh memory-predict:0.9 0: [/bin/sh -c #(nop) CMD ["root/run.sh"]] 1: sha256:3e511d07e45703d74561e233f23ff537f9683503f793d23384d86b1be3de5a1d 1: [/bin/sh -c #(nop) COPY dir:8368956cf32bdd81375211d1084c9ab35cd22b8ffec16bcf2d796bf4ee1cf42c in /root/memory ] 2: sha256:e49bd77647a401c038536b116fa9c99758d4aa52bff646c30933bfafcf4b0959 2: [/bin/sh -c mkdir -p /var/log/gslogs/gdp/memory/info && mkdir -p /var/log/gslogs/gdp/memory/error && mkdir -p /var/log/gslogs/gdp/model_build/info && mkdir -p /var/log/gdp/model_build/error] 3: sha256:bb930d11c8a453e635fc7258978ea3a18c33e81440c94335a204870aa3279d45 3: [/bin/sh -c #(nop) COPY file:61325ce5f794a14777b1400229417bd9cb17145565aa9eb7568a0e47fe5d8717 in /root/ ] 4: sha256:96fec49b6a2b242c339ef4ca69d67a8f37d12ab8a7143e357016284affb545fb 4: [/bin/sh -c #(nop) COPY file:9a6cf89dc229b62ca8bc553e4223036a5e949ce9f9d16ab1ad736bb42e658c78 in /etc/nxlog/nxlog.conf ] 5: sha256:5c8d30b626de68fd7db97e9eb7e542d23beba22629ab8817c542dc598954e8e0 5: [/bin/sh -c #(nop) COPY file:f8bebfc3a3cf94e7bc28416d7ee090c011719ea9edcbefa92652b5f274e36b75 in /root/ ] 6: sha256:74df8cb53015ec169552df5ea73d75613783decc8f385123eb335f13332901c7 6: [/bin/sh -c #(nop) COPY file:6da6f2b6420f347ce600823cb433afdd2b3371f69720ac100ee48dbd295a4688 in /root/ ] 7: sha256:eeca83861660f1b99b3ec4aea1ddc0bcd84b55dcd414c542e065177b03e5f5f5 7: [/bin/sh -c #(nop) COPY file:a6c5b2e34dd38325770c5a635aa5c3d021d3800d7275a755756c6fa94e0aa20d in /etc/ ] 8: sha256:329fdc1e9022fe805066b4c10c470a5bc9ebfb993fe1e147dcdddcc682b1a675 8: [/bin/sh -c #(nop) COPY file:18522c0551499a5aee8e786566e3cbf7154fabe99125cae7c394df54ddb3126b in /etc/localtime ] 9: sha256:edc362dedb539ff494732deea92b552dfb954a93ad0611f3eab74e53d60e7b04 9: [/bin/sh -c #(nop) ENV LC_ALL=C.UTF-8] 10: sha256:ee5629e8cc755f2015bdce23f9e8329167e7cd02b28d82efc6006e7ef7a82953 10: [/bin/sh -c pip3 --no-cache-dir --timeout 3600 --trusted-host repository.gridsum.com install -i https://repository.gridsum.com/repository/pypi-public/simple `cat /root/depend_pip3`] 11: sha256:96d658a53ed76636bb5d07b9bc9cbaab3cad20406c7f4ba17abac1a83ad7fde7 11: [/bin/sh -c pip3 --no-cache-dir --timeout 3600 --trusted-host repository.gridsum.com install --upgrade -i https://repository.gridsum.com/repository/pypi-public/simple Cython] 12: sha256:c81a9d5651e2eb1c7bfe93a72052e620005df0485fa88624d9a43ee64b7c5539 12: [/bin/sh -c #(nop) COPY file:3748ebb6c0b55f42ee0c3f4b38c97ac17df94f56a5ccc140fbccd583f1f53bb5 in /root/ ] 13: sha256:8878cb6ff2a175ae4d9200e9eca203be78b43e2b141177b2def9724c086ed2aa 13: [/bin/sh -c cd /root/ && wget -q https://nxlog.co/system/files/products/files/348/nxlog-ce_2.9.1716_ubuntu_1604_amd64.deb --no-check-certificate && dpkg -i nxlog-ce_2.9.1716_ubuntu_1604_amd64.deb && rm nxlog-ce_2.9.1716_ubuntu_1604_amd64.deb] 14: sha256:4ec81a6df9cc8305c1643d60398f1e78243253e39b9bb73b2ccc3c9ded224ba3 14: [/bin/sh -c apt-get -y update && DEBIAN_FRONTEND=noninteractive apt-get -y install --no-install-recommends `cat /root/depend_ubuntu16.04` && DEBIAN_FRONTEND=noninteractive apt-get -y install --no-install-recommends libapr1 libdbi1 libexpat1 libperl5.22 && apt-get clean && rm -rf /var/lib/apt/lists/*] 15: sha256:dd68b1ee537a0d638eab8342c68f37fa3a10311884aa0bcfec27bc5ecb0e4bec 15: [/bin/sh -c #(nop) COPY file:2835abe77876ddc832140365f9d45e2f6066f80c1c8bb7918e565a0e82a94dd2 in /root/ ] 16: sha256:41c7a9325f68df244ca6d68d76ebf59525d98b5fb2e19cc65effd38839be4d1e 16: [/bin/sh -c echo 'deb http://mirrors.ustc.edu.cn/ubuntu/ xenial main restricted universe multiverse' > /etc/apt/sources.list && echo 'deb http://mirrors.ustc.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse' >> /etc/apt/sources.list] 17: sha256:e1100cf1f531504d60a615eb68838bc2170433ef145757ccf4588817a0192013 17: [/bin/sh -c #(nop) MAINTAINER zhangshuangyan] 18: sha256:ccc7a11d65b1b5874b65adb4b2387034582d08d65ac1817ebc5fb9be1baa5f88 18: [/bin/sh -c #(nop) CMD ["/bin/bash"]]
参考:https://forums.docker.com/t/how-can-i-view-the-dockerfile-in-an-image/5687/3
有时候构建镜像可能是一个逐步优化逐步迭代的过程,我们会以之前构建的镜像为基础镜像,然后再在上面添加一些操作或者文件。但是恰好我们又忘记对镜像文件的代码进行版本管理,而最新版本的镜像文件Dockerfile里边只能看到依赖的老镜像和寥寥的几个命令,那么怎样还原出这个镜像完整的操作命令呢? 我们可以通过逆向迭代查找到镜像的母镜像链,然后查看这个链上的每个镜像对它的母镜像做了哪些修改,下面这个shell脚本可以满足我们的需求: trace_cmd.sh
然后我们执行下面的命令就可以看到迭代的过程了
例如,查看我的memory-predict:0.9镜像的迭代过程
参考:https://forums.docker.com/t/how-can-i-view-the-dockerfile-in-an-image/5687/3