如何合并兩個Docker 鏡像

jopen 9年前發布 | 46K 次閱讀 Docker

【編者的話】本文介紹了如何通過docker history命令來對docker 鏡像進行反向工程推測它們的Dockerfile,從而在對不同的Docker 鏡像反向工程獲取Dockerfile 之后合并成一個。

常言道,“不要重復發明輪子!”

在使用docker 時,最好在構建你自己的鏡像前上 Docker Hub 尋找一些直接可以用的。把你的軟件架構分布到一系列容器中,每一個容器只做一件事情是非常有用的。構建分布式應用的最好的基石是使用來自Docker Hub 的官方鏡像,因為你可以信任它們的質量。

在某些情況下,你可能想讓一個容器做兩件不同的事情。在另一些情況下,你可能想讓一個Docker 鏡像包含來自兩個不同鏡像的依賴。 如果你有每個鏡像的Dockerfile,這是非常簡單的。將它們組織到一個Dockerfile 里然后build 即可。

但是,如果大多數時間你都在使用Docker Hub 上準備好的鏡像,你將沒有它們的源Dockerfile。我花了一些時間來找這樣一個工具,它可以合并(或flatten)兩個不同的我沒有它們的 Dockerfile 的Docker 鏡像。即我在找一個能做下面這件事的東西:

image 1 --
\
---> merged_image_12
/
image 2 --

盡管這個問題在之前的兩個進程中被關閉了( 12 ),當你想這么做時,這個問題仍然會產生。

這可能嗎?

即有任何工具能夠像這樣做嗎:docker merge image2 image2 merged_image?

沒有!

你甚至不能這樣來構建一個Dockerfile:

FROM image1
FROM image2

簡而言之,你不能在一個Dockerfile 里有多個基礎鏡像。

但是我需要這個功能!

唯一的解決辦法是取得這些鏡像的Dockerfile 然后把它們組織到一個文件中,再進行構建。所以我能在Docker Hub 上取得一個鏡像的Dockerfile 嗎? 幸運的是可以。 它不能離線獲取(譯注:原文是online 但顯然online 時對于來自Github 的自動構建鏡像是可以直接獲取的),但是你可以通過 docker history 命令來反向工程獲得。

怎么來使用?

在你的機器上使用docker pull來從Docker Hub下載鏡像。

docker pull image1
docker pull image2

然后使用docker history來取得構建這兩個容器時運行的命令。

docker history --no-trunc=true image > image1-dockerfile
docker history --no-trunc=true image2 > image2-dockerfile

接下來打開這兩個文件,你可以看到每個鏡像的命令堆棧。這是因為Docker 鏡像通過層( 閱讀更多 )的方式來組織。即每一個你在Dockerfile 中鍵入的命令都會產生一個從之前的命令產生的鏡像之上的一個新鏡像。所以你可以對鏡像逆向工程。

限制

唯一的你不能夠反向工程鏡像的場景是鏡像的維護者在他的Dockerfile 中使用了ADD或COPY命令。你會看到這樣一行:

ADD file:1ac56373f7983caf22
或 ADD dir:cf6fe659e9d21535844

這是因為你不能知道維護者在他自己的機器上用了什么本地文件在鏡像中。

反向工程愉快 :smile:

原文鏈接: How to Merge Two Docker Images (翻譯:陳光)

</div> 原文 http://dockone.io/article/527

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!