2017-02-03 79 views
0

我在我的Maven Java項目中有一個Docker構建文件來構建它。碼頭圖片結束大約1GB。我想要做的就是建立戰爭神器並保持尺寸不變。這是我到目前爲止:Docker構建映像1GB或太大

FROM java:8 

#FROM maven:latest 
MAINTAINER Sonam <[email protected]> 

RUN apt-get update 
RUN apt-get install -y maven 

WORKDIR /code 

#Prepare by downloading dependencies 
ADD pom.xml /code/pom.xml 
RUN ["mvn", "dependency:resolve"] 
RUN ["mvn", "verify"] 

#Adding source, compile and package into a fat jar 
ADD src /code/src 

RUN ["mvn", "clean"] 
RUN ["mvn", "install", "-Dmaven.test.skip=true"] 

RUN mkdir webapps 

CMD ["echo"] ["hello"] 

我有一個CoreOS單元文件,當這個容器運行時,我想複製戰爭到另一個文件。

回答

1

你可以看到在「How do I build a Docker image for a Ruby project without build tools?

  • 我,用圖像來建立一個替代方案,
  • 我犯了導致停止容器作爲新的圖像(包括生成的二進制文件的卷)
  • 我使用一個執行映像(一個只包含你需要運行的映像),並從另一個映像複製二進制文件。我再次提交所產生的容器。

最終圖像包括編譯後的二進制文件和執行環境。

在你的情況下,確保你當前的Dockerfile聲明瞭一個卷並在其中產生war(來自maven編譯)。

然後提交退出的容器作爲新的臨時「編譯」圖像。
使用另一個Dockerfile,它將運行並複製編譯映像的war-from-volume。

docker run -u root -it --name=installation.cont --volumes-from compilation.cont --entrypoint "/bin/sh" installation.image -c "cp /avolume/myway /to/my/path" 

所得停止容器installation.cont可以被提交爲圖像installation.image

然後,你可以寫一個第三 Dockerfile,從形象出發:FROM installation.image(只包括你的戰爭),並添加你需要以使用戰爭是什麼。 docker commit apache.inst.cont apache.inst

+0

它看起來很複雜,但會看到我是否可以公司化您的想法。謝謝Vonc – Sonam

+1

@Sonam它的確如此,但基本的想法是在一個容器中構建你的二進制文件,並將它複製到另一個容器中,一旦提交,它將成爲你的基本映像。 – VonC