如何合併兩個Docker 映象

2021-09-22 23:56:47 字數 1791 閱讀 3840

本文講的是如何合併兩個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 image1

from image2

簡而言之,在乙個dockerfile裡不能有多個基礎映象。

唯一的解決辦法是取得這些映象的dockerfile,然後把它們組織到乙個檔案中,再進行構建。那麼,我能在docker hub上獲得乙個映象的dockerfile嗎? 幸運的是可以。它不能離線獲取(譯註:原文是online,但顯然online時對於來自github的自動構建映象是可以直接獲取的),但是你可以使用

docker history

命令,通過反向工程獲取。

怎麼來使用?

在你的機器上使用docker pull

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中使用了addcopy命令。你會看到這樣一行:

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 ...