一千萬個為什麽

搜索

構建docker鏡像是否需要docker守護程序運行?



我試圖用Docker /容器弄濕我的腳。我從這個教程開始:

https://spring.io/guides/gs/spring-boot-docker/

它工作正常,但我很驚訝有必要運行“dockerd”守護進程來構建一個圖像。它使用localhost和端口號連接到它,作為執行Maven構建的一部分。為什麽需要(並且可以避免)?我的意思是,在許多情況下,無論如何圖像都必須在一個單獨的平臺上運行。這特別令人討厭,因為我在Windows上構建,Docker要求您啟用Hyper-V,這會導致其他問題(例如,您無法在同一臺計算機上使用VMWare)。

由於這些問題,我使用Linux VM(然後運行Docker守護程序)來構建它。

可能與上述內容有關的另一件事:似乎構建過程不會將映像保留在磁盤上,而是直接安裝到由docker守護程序管理的存儲庫中。然後我可以從命令行導出圖像,我想(還沒試過)這個圖像可以移動到另一臺機器並從那裏運行。但是,如何構建“只是”圖像而不將其部署在任何地方等等。它只需要在本地文件系統中生成工件並保留它。也許這也會消除讓Docker運行的要求?

本教程用於運行Maven的命令是:

./mvnw install dockerfile:build

然而,嘗試“安裝”的替代品(例如“包裝”等)似乎不會改變行為。

轉載註明原文: 構建docker鏡像是否需要docker守護程序運行?

一共有 2 個回答:

Dockerfile中的每個命令都作為單獨的步驟處理。構建過程中的每一步都在專用容器中執行。它從第1步(Dockerifle中的第一個命令)開始。該步驟在容器中運行,如果成功,則發生對臨時圖像的提交(讓我們稱之為圖像A)。然後,在從圖像A ...運行的容器中執行步驟2,依此類推,直到成功執行最後一步。正如Tensibai評論的那樣 - 你怎麽想在沒有守護進程的情況下運行容器?

所以,是的 - 構建一個docker鏡像需要docker守護進程運行。

docker客戶端是dockerd REST API的CLI接口。客戶端本身很少發生。 Docker在dockerd引擎上執行構建步驟,並且更改這將是一項非常重要的任務。每個 RUN 步驟都會創建一個臨時容器來執行命令,並將生成的容器文件系統收集為新層。構建緩存作為服務器上的映像進行維護。圖像的每一層都由docker引擎中的存儲驅動程序管理。

嘗試刪除此依賴項有各種嘗試,但每個嘗試的最大絆腳石將是 RUN 使用的臨時容器,這需要在服務器上設置容器運行時和root訪問權限。