欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解如何基于Docker鏡像逆向生成Dockerfile

 更新時(shí)間:2024年03月08日 09:02:11   作者:云原生運(yùn)維圈  
這篇博客文章我們將通過使用一些開源工具,帶領(lǐng)您逐步解讀?Docker?鏡像并轉(zhuǎn)換為?Dockerfile?的過程,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

引言

你是否曾經(jīng)遇到過一個(gè)想要使用的 Docker 鏡像,但卻無法修改以適應(yīng)你的特定需求?或者你可能發(fā)現(xiàn)了一個(gè)喜歡的 Docker 鏡像,但想要了解它是如何構(gòu)建的?在這兩種情況下,將 Docker 鏡像逆向生成一個(gè) Dockerfile 可以使用一些工具來實(shí)現(xiàn)。

將 Docker 鏡像轉(zhuǎn)換為 Dockerfile 意味著獲取現(xiàn)有的 Docker 鏡像,并使用它來創(chuàng)建一個(gè)你可以修改和控制的 Dockerfile。

這個(gè)過程讓你能夠理解 Docker 鏡像的內(nèi)部運(yùn)作方式,進(jìn)行修改,更新鏡像以在不同平臺(tái)上運(yùn)行,或者根據(jù)特定需求對(duì)其進(jìn)行優(yōu)化。

在這篇博客文章中,我們將通過使用一些開源工具,帶領(lǐng)您逐步解讀 Docker 鏡像并轉(zhuǎn)換為 Dockerfile 的過程。

使用Dedockify工具實(shí)現(xiàn)

Docker 鏡像就像黑匣子,包含了在鏡像構(gòu)建過程中執(zhí)行的一系列指令層。

現(xiàn)在有了 Dedockify,一個(gè)使用 Python 腳本的工具,可以幫助重建創(chuàng)建鏡像所使用的 Dockerfile 的近似版本。

Dedockify 的工作原理是利用存儲(chǔ)在每個(gè)鏡像層旁邊的元數(shù)據(jù)。它通過沿著層級(jí)樹向后遍歷,收集與每個(gè)層相關(guān)聯(lián)的命令。

這個(gè)過程使它能夠重建在鏡像構(gòu)建過程中執(zhí)行的命令序列。

然而,有一個(gè)問題:如果使用了 COPY 或 ADD 指令,Dedockify 生成的輸出不會(huì)完全匹配原始的 Dockerfile。這是因?yàn)?Dedockify 無法訪問在執(zhí)行原始的 docker build 命令時(shí)存在的構(gòu)建上下文。

要使用 Dedockify,可以將其作為一個(gè) Docker 容器運(yùn)行:

docker run -v /var/run/docker.sock:/var/run/docker.sock dedockify <imageID>

參數(shù) <imageID> 是鏡像 ID(可以是縮短形式或完整的鏡像 ID)。

該腳本通過與 Docker API 交互來查詢各個(gè)鏡像層的元數(shù)據(jù),因此需要訪問 Docker API 套接字。上面顯示的 -v 標(biāo)志使得在運(yùn)行腳本的容器內(nèi)部可以使用 Docker 套接字。

工作原理是什么?

當(dāng)從 Dockerfile 構(gòu)建鏡像時(shí),Dockerfile 中的每個(gè)指令都會(huì)生成一個(gè)新的層。您可以使用 docker images 命令和(現(xiàn)在已棄用的)--tree 標(biāo)志來查看所有的鏡像層。

$ docker images --tree
Warning: '--tree' is deprecated, it will be removed soon. See usage.
└─511136ea3c5a Virtual Size: 0 B Tags: scratch:latest
  └─1e8abad02296 Virtual Size: 121.8 MB
    └─f106b5d7508a Virtual Size: 121.8 MB
      └─0ae4b97648db Virtual Size: 690.2 MB
        └─a2df34bb17f4 Virtual Size: 808.3 MB Tags: buildpack-deps:latest
          └─86258af941f7 Virtual Size: 808.6 MB
            └─1dc22fbdefef Virtual Size: 846.7 MB
              └─00227c86ea87 Virtual Size: 863.7 MB
                └─564e6df9f1e2 Virtual Size: 1.009 GB
                  └─55a2d383d743 Virtual Size: 1.009 GB
                    └─367e535883e4 Virtual Size: 1.154 GB
                      └─a47bb557ed2a Virtual Size: 1.154 GB
                        └─0d4496202bc0 Virtual Size: 1.157 GB
                          └─5db44b586412 Virtual Size: 1.446 GB
                            └─bef6f00c8d6d Virtual Size: 1.451 GB
                              └─5f9bee597a47 Virtual Size: 1.451 GB
                                └─bb98b84e0658 Virtual Size: 1.452 GB
                                  └─6556c531b6c1 Virtual Size: 1.552 GB
                                    └─569e14fd7575 Virtual Size: 1.552 GB
                                      └─fc3a205ba3de Virtual Size: 1.555 GB
                                        └─5fd3b530d269 Virtual Size: 1.555 GB
                                          └─6bdb3289ca8b Virtual Size: 1.555 GB
                                            └─011aa33ba92b Virtual Size: 1.555 GB Tags: ruby:2, ruby:2.1, ruby:2.1.1, ruby:latest

這些層中的每一個(gè)都是在 Dockerfile 中執(zhí)行指令的結(jié)果。事實(shí)上,如果您對(duì)這些層中的任何一個(gè)執(zhí)行 docker inspect,您可以看到用于生成該層的指令。

$ docker inspect 011aa33ba92b
[{
  . . .
  "ContainerConfig": {
    "Cmd": [
        "/bin/sh",
        "-c",
        "#(nop) ONBUILD RUN [ ! -e Gemfile ] || bundle install --system"
    ],
    . . .
}]

Docker 示例:

以下是一個(gè)示例,展示了如何拉取官方的 Docker Ruby 鏡像并生成該鏡像的 Dockerfile。

$ docker pull mrhavens/dedockify
Using default tag: latest
latest: Pulling from dedockify

$ alias dedockify="docker run -v /var/run/docker.sock:/var/run/docker.sock --rm mrhavens/dedockify"

$ dedockify <imageID>
FROM buildpack-deps:latest
RUN useradd -g users user
RUN apt-get update && apt-get install -y bison procps
RUN apt-get update && apt-get install -y ruby
ADD dir:03090a5fdc5feb8b4f1d6a69214c37b5f6d653f5185cddb6bf7fd71e6ded561c in /usr/src/ruby
WORKDIR /usr/src/ruby
RUN chown -R user:users .
USER user
RUN autoconf && ./configure --disable-install-doc
RUN make -j"$(nproc)"
RUN make check
USER root
RUN apt-get purge -y ruby
RUN make install
RUN echo 'gem: --no-rdoc --no-ri' >> /.gemrc
RUN gem install bundler
ONBUILD ADD . /usr/src/app
ONBUILD WORKDIR /usr/src/app
ONBUILD RUN [ ! -e Gemfile ] || bundle install --system

使用Dive工具實(shí)現(xiàn)

Dive 是一個(gè)用于探索 Docker 鏡像、層內(nèi)容,并發(fā)現(xiàn)縮小 Docker/OCI 鏡像大小的方法的工具。

Dive 是一個(gè)用于探索 Docker 鏡像、層內(nèi)容,并發(fā)現(xiàn)可以減小鏡像大小的方法的工具。它提供了對(duì)每個(gè)層內(nèi)容的詳細(xì)分解,包括文件大小、權(quán)限等。特別適用于識(shí)別可以刪除以減小鏡像大小的不必要文件或依賴項(xiàng)。

特點(diǎn):

  • 詳細(xì)的層內(nèi)容分解:Dive 提供了對(duì) Docker 或 OCI 鏡像中每個(gè)層內(nèi)容的詳細(xì)分解。它顯示每個(gè)文件的大小、權(quán)限和其他元數(shù)據(jù)。
  • 色彩編碼界面:Dive 使用色彩編碼界面突出顯示不同類型的文件。這使得識(shí)別并刪除不必要的文件或依賴項(xiàng)變得容易。
  • 交互式探索:Dive 允許您交互式地探索每個(gè)層的內(nèi)容。您可以瀏覽各個(gè)層、查看單個(gè)文件,并進(jìn)行更改以優(yōu)化您的鏡像。
  • 優(yōu)化建議:Dive 提供了優(yōu)化鏡像的建議。它識(shí)別大文件、不必要的依賴項(xiàng)和其他潛在的優(yōu)化方案。

使用方法:

要使用 Dive,您需要在系統(tǒng)上安裝它,并針對(duì)一個(gè) Docker 或 OCI 鏡像運(yùn)行它:

dive <imageID>

例如,要分析官方的 Alpine Linux 鏡像,您可以運(yùn)行:

dive alpine:latest

然后 Dive 將顯示鏡像層的詳細(xì)分解,讓您可以探索每個(gè)層的內(nèi)容并識(shí)別潛在的優(yōu)化。

除了像 Dive 這樣的第三方工具外,我們可以立即使用的工具是 docker history。如果我們?cè)谑纠?鏡像上使用 docker history 命令,我們可以查看在 Dockerfile 中用來創(chuàng)建該鏡像的條目。

docker history nginx

因此,我們應(yīng)該得到以下結(jié)果:

IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
374e0127c1bc        25 minutes ago      /bin/sh -c #(nop) COPY file:aa717ff85b39d3ed…   0B
84acff3a5554        25 minutes ago      /bin/sh -c #(nop) COPY file:2a949ad55eee33f6…   0B
a9cc49948e40        25 minutes ago      /bin/sh -c #(nop) COPY file:e3c862873fa89cbf…   0B

請(qǐng)注意,CREATED BY 列中的所有內(nèi)容都被截?cái)嗔?。這些是通過 Bourne shell 傳遞的 Dockerfile 指令。這些信息可能對(duì)重新創(chuàng)建我們的 Dockerfile 有用,盡管在這里被截?cái)嗔耍覀円部梢酝ㄟ^使用 --no-trunc 選項(xiàng)來查看所有內(nèi)容:

$ docker history example1 --no-trunc
IMAGE                                                                     CREATED             CREATED BY                                                                                           SIZE                COMMENT
sha256:374e0127c1bc51bca9330c01a9956be163850162f3c9f3be0340bb142bc57d81   29 minutes ago      /bin/sh -c #(nop) COPY file:aa717ff85b39d3ed034eed42bc1186230cfca081010d9dde956468decdf8bf20 in /    0B
sha256:84acff3a5554aea9a3a98549286347dd466d46db6aa7c2e13bb77f0012490cef   29 minutes ago      /bin/sh -c #(nop) COPY file:2a949ad55eee33f6191c82c4554fe83e069d84e9d9d8802f5584c34e79e5622c in /    0B
sha256:a9cc49948e40d15166b06dab42ea0e388f9905dfdddee7092f9f291d481467fc   29 minutes ago      /bin/sh -c #(nop) COPY file:e3c862873fa89cbf2870e2afb7f411d5367d37a4aea01f2620f7314d3370edcc in /    0B

雖然這里包含一些有用的數(shù)據(jù),但從命令行解析可能會(huì)有些挑戰(zhàn)。我們也可以使用 docker inspect。

Dockerfile From Image (dfimage)

類似于 docker history 命令的工作方式,Python 腳本可以使用 Docker 存儲(chǔ)在每個(gè)鏡像層旁邊的元數(shù)據(jù)重新創(chuàng)建(近似地)用于生成鏡像的 Dockerfile。

https://github.com/LanikSJ/dfimage

Python 腳本本身被打包為一個(gè) Docker 鏡像,這樣就可以很容易地使用 Docker run 命令來執(zhí)行:

docker run -v /var/run/docker.sock:/var/run/docker.sock dfimage ruby:latest

ruby:latest 參數(shù)是鏡像名稱和標(biāo)簽(可以是縮寫形式或完整的鏡像名稱和標(biāo)簽)。

由于該腳本與 Docker API 交互以查詢各種鏡像層的元數(shù)據(jù),因此它需要訪問 Docker API 套接字。上面顯示的 -v 標(biāo)志使得 Docker 套接字在運(yùn)行腳本的容器內(nèi)可用。

請(qǐng)注意,該腳本僅適用于存在于您本地鏡像倉(cāng)庫(kù)中的鏡像(即您在鍵入 docker images 時(shí)看到的內(nèi)容)。如果要為本地倉(cāng)庫(kù)中不存在的鏡像生成 Dockerfile,則首先需要使用 docker pull 命令拉取該鏡像。

總結(jié)

將 Docker 鏡像逆向工程為 Dockerfile,或者稱為“回溯 Docker 鏡像”,是一種有用的技術(shù),可以幫助理解和重新創(chuàng)建鏡像的構(gòu)建過程。工具如 Dive 和 Dedockify 可以通過分析鏡像層和元數(shù)據(jù)來生成相應(yīng)的 Dockerfile,從而提供幫助。

以上就是詳解如何基于Docker鏡像逆向生成Dockerfile的詳細(xì)內(nèi)容,更多關(guān)于Docker鏡像逆向生成Dockerfile的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Docker 常見問題解決

    Docker 常見問題解決

    這篇文章主要介紹了如何解決Docker 常見問題,幫助大家更好的理解和使用docker容器,感興趣的朋友可以了解下
    2020-09-09
  • Docker中部署Nginx并掛載配置文件的實(shí)現(xiàn)

    Docker中部署Nginx并掛載配置文件的實(shí)現(xiàn)

    本文主要介紹了Docker中部署Nginx并掛載配置文件的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • IDEA連接遠(yuǎn)程服務(wù)器Docker部署Spring Boot項(xiàng)目的詳細(xì)教程

    IDEA連接遠(yuǎn)程服務(wù)器Docker部署Spring Boot項(xiàng)目的詳細(xì)教程

    這篇文章主要介紹了IDEA連接遠(yuǎn)程服務(wù)器Docker部署Spring Boot項(xiàng)目,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • 遷移Docker中MySQL容器的全過程

    遷移Docker中MySQL容器的全過程

    在這篇文章中,我們將介紹如何將在 Docker 中運(yùn)行的 MySQL 容器從一臺(tái)機(jī)器(我們稱之為A機(jī)器)遷移到另一臺(tái)機(jī)器(我們稱之為B機(jī)器),這個(gè)過程主要包括五個(gè)步驟:提交容器為鏡像,保存鏡像為 tar 包等,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下
    2023-12-12
  • docker?compose快速開始超詳細(xì)教程

    docker?compose快速開始超詳細(xì)教程

    docker-compose是基于docker的開源項(xiàng)目,托管于github上,由python實(shí)現(xiàn),調(diào)用?docker服務(wù)的API負(fù)責(zé)實(shí)現(xiàn)對(duì)docker容器集群的快速編排,即通過一個(gè)單獨(dú)的yaml文件,來定義一組相關(guān)的容器來為一個(gè)項(xiàng)目服務(wù),本文給大家介紹docker?compose快速開始,感興趣的朋友一起看看吧
    2022-05-05
  • Docker push鏡像失敗解決方法

    Docker push鏡像失敗解決方法

    這篇文章主要介紹了Docker push鏡像失敗解決方法的相關(guān)資料,這里對(duì)解決push 鏡像失敗提供了解決方案,需要的朋友可以參考下
    2016-12-12
  • docker啟動(dòng)nginx無法訪問的問題解決

    docker啟動(dòng)nginx無法訪問的問題解決

    本文主要介紹了docker啟動(dòng)nginx無法訪問的問題解決,主要遇到404錯(cuò)誤,問題原因是配置文件路徑錯(cuò)誤和權(quán)限問題,下面就來具體介紹一下問題解決,感興趣的可以了解一下
    2025-02-02
  • Docker容器數(shù)據(jù)卷的使用教程

    Docker容器數(shù)據(jù)卷的使用教程

    數(shù)據(jù)卷容器是一個(gè)專門用來掛載數(shù)據(jù)卷的容器,該容器主要是供其他容器引用和使用,下面這篇文章主要給大家介紹了關(guān)于Docker容器數(shù)據(jù)卷使用的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • 搭建Docker私有倉(cāng)庫(kù)(自簽名方式)

    搭建Docker私有倉(cāng)庫(kù)(自簽名方式)

    為了能集中管理我們創(chuàng)建好的鏡像,方便部署服務(wù),我們會(huì)創(chuàng)建私有的Docker倉(cāng)庫(kù)。這篇文章主要介紹了搭建Docker私有倉(cāng)庫(kù)(自簽名方式),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • docker中mysql初始化及啟動(dòng)失敗問題解決方案

    docker中mysql初始化及啟動(dòng)失敗問題解決方案

    這篇文章主要介紹了docker中mysql初始化及啟動(dòng)失敗問題解決方案的相關(guān)資料,需要的朋友可以參考下
    2016-10-10

最新評(píng)論