2017-02-03 53 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