2016-09-22 115 views
1

爲什麼maven3 docker鏡像中的/root/.m2文件寫入的內容在構建過程中是持久的?無法在docker maven container中寫入〜/ .m2

一個簡單dockerfile:

FROM maven:3-jdk-8 
RUN touch /root/.m2/testfilehere && ls -a /root/.m2 
RUN ls -a /root/.m2 
CMD ["bash"] 

產生以下輸出。

$ docker build -t test --no-cache . 
Sending build context to Docker daemon 2.048 kB 
Step 1 : FROM maven:3-jdk-8 
---> 42e3884987fb 
Step 2 : RUN touch /root/.m2/testfilehere && ls -a /root/.m2 
---> Running in 1c1dc5e9f082 
. 
.. 
testfilehere 
---> 3da352119c4d 
Removing intermediate container 1c1dc5e9f082 
Step 3 : RUN ls -a /root/.m2 
---> Running in df506db8c1dd 
. 
.. 
---> d07cc155b20e 
Removing intermediate container df506db8c1dd 
Step 4 : RUN stat /root/.m2/testfilehere 
---> Running in af44f30aafe5 
stat: cannot stat ‘/root/.m2/testfilehere’: No such file or directory 
The command '/bin/sh -c stat /root/.m2/testfilehere' returned a non-zero code: 1 

當中間容器存在時,在第一個命令中創建的文件不見了。

此外,這不會發生在Ubuntu的圖像,只是maven。

編輯:使用ADD hostfile /root/.m2/containerfile確實是一種解決方法,但不是我想要的。

回答

1

這是因爲/root/.m2被定義爲0啓動時執行在圖像中。當容器的容積,容積存儲is not part of the UnionFS運行 - 所以它的數據沒有儲存在容器中的寫層:

的數據量是繞過歐盟文件中的一個或多個容器內的特別指定的目錄系統。

第一RUN命令在卷文件,但這是在中介容器用自己的音量。該文件不會保存到圖像層,因爲它位於卷中。

第二個RUN命令運行在新的中間容器,它有自己的卷。基本映像中沒有卷的內容,因此新容器中的卷是空的。

如果您想用數據預先填充卷,則需要在Dockerfile中執行此操作,如您所見。

1

行家泊塢窗圖像有一個入口點

ENTRYPOINT ["/usr/local/bin/mvn-entrypoint.sh"] 

在容器啓動,入口點拷貝文件從/ usr /共享/行家/ REF到$ {MAVEN_CONFIG}與刪除文件

你可以看到腳本通過以下鏈接

https://github.com/carlossg/docker-maven/blob/33eeccbb0ce15440f5ccebcd87040c6be2bf9e91/jdk-8/mvn-entrypoint.sh

+0

入口點不應該是一個問題。在運行容器之前,即在執行文件創建的Dockerfile命令之後進行擦除。 – npit

+0

正如此鏈接https://docs.docker中的解釋。com/engine/reference/builder /#/ understand-how-cmd-and-entrypoint-interact 在運行CMD/bin/bash之前執行入口點 如果你想確定當你做出ls seconde時間,你可以看到copy_reference_file.log settings-docker.xml 它們從maven ref目錄複製而來 – Thibaut