本文講的是如何合併兩個docker 映象,
【編者的話】當我們想讓乙個容器做兩件事情,或者使乙個docker映象包含來自兩個不同映象的依賴庫時,我們就需要知道每個映象的dockerfile。本文介紹了如何通過docker history
命令來對docker映象進行反向工程,得到它們的dockerfile,並組織到乙個dockerfile裡然後build,從而實現我們想做的事情。
常言道,「不要重**明輪子!」
在使用docker時,構建自己的映象之前,最好在
docker hub
尋找一些可以直接使用的映象做練習。把你的軟體架構分布到一系列容器中,每乙個容器只做一件事情,這樣的效果非常好。構建分布式應用的最好的基石是使用來自docker hub的官方映象,因為你可以信任它們的質量。
然而,大多數時間你都在使用docker hub上準備好的映象,你不會有它們的源dockerfile。我花時間找乙個可以合併(或flatten)兩個不同docker映象的工具,當然我沒有它們的dockerfile。也就是說我在找乙個能做下面這件事的東西:
image 1 --\---> merged_image_12
/image 2 --
此前在github上有兩個相關的討論(1、
2),儘管它們都被關閉了。
那麼,是否存在工具能夠像這樣做嗎:docker merge image2 image2 merged_image
?
你甚至不可以用下面的方式來構建dockerfile:
from image1from image2
簡而言之,在乙個dockerfile裡不能有多個基礎映象。
唯一的解決辦法是取得這些映象的dockerfile,然後把它們組織到乙個檔案中,再進行構建。那麼,我能在docker hub上獲得乙個映象的dockerfile嗎? 幸運的是可以。它不能離線獲取(譯註:原文是online,但顯然online時對於來自github的自動構建映象是可以直接獲取的),但是你可以使用
docker history
命令,通過反向工程獲取。
怎麼來使用?
在你的機器上使用docker pull
docker pull image1docker pull image2
然後使用docker history
來取得構建這兩個容器時執行的命令。
docker history --no-trunc=true image > image1-dockerfiledocker history --no-trunc=true image2 > image2-dockerfile
接下來開啟這兩個檔案,你可以看到每個映象的命令堆疊。這是因為docker映象通過層(
閱讀更多
)的方式來構建。即你在dockerfile中鍵入的每乙個命令所構建的新映象,都是在之前的命令產生的映象之上。所以你可以對映象進行逆向工程。
限制你不能對映象進行反向工程的唯一場景,是映象的維護者在他的dockerfile中使用了add
或copy
命令。你會看到這樣一行:
add file:1ac56373f7983caf22或 add dir:cf6fe659e9d21535844
這是因為你不知道維護者在他自己的機器上,包括映象裡使用了什麼本地檔案。
原文發布時間為:2015-07-24
如何合併兩個Docker 映象
docker pull image1 docker pull image2 然後使用docker history來取得構建這兩個容器時執行的命令。docker history no trunc true image image1 dockerfile docker history no trunc ...
mysql合併兩個表 MYSQL如何合併兩個表
1級2013 06 01 回答 1 table1加乙個file4 2 update table1 inner join select field4 from table2 c set table1.field4 c.field4 追問 沒有成功啊 追答 貼錯誤 追問 首先謝謝大神幫忙。我具體說一下 ...
docker下刪除兩個id相同的映象
docker.io ubuntu 14.04 5dbc3f318ea5 4 weeks ago 188 mb ubuntu 14.04 5dbc3f318ea5 4 weeks ago 188 mb 使用docker rmi 5dbc3f318ea5刪除的時候執行失敗 error response ...