译者按: 最新版Docker将支持多步构建(Multi-stage build),这样使用单个Dockerfile就能够定义多个中间镜像用于构建,测试以及发布等多个步骤,而且有效减少最终镜像的大小。java
原文: Creating Smaller Java Image using Docker Multi-stage Buildgit
译者: Fundebuggithub
为了保证可读性,本文采用意译而非直译。docker
Github仓库: arun-gupta/docker-java-multistageshell
DockerCon 2017中与Java开发者直接相关的内容有:oracle
这篇博客介绍了为何须要Docker多步构建(Docker Multi-stage build),而且经过一个示例展现了如何构建更小的Java镜像。app
为Java应用构建Docker镜像意味着编译源代码以及打包目标代码。开发者一般会使用Maven或者Gradle来构建JAR或WAR文件。若使用Maven镜像做为基础镜像来构建Java应用,则须要下载全部Maven依赖。下载的JAR包数目由pm.xml
决定,有可能会很是多。这样的话,生成的Docker镜像中将留下太多多余的文件。curl
下面为示例Dockerfile:maven
FROM maven:3.5-jdk-8 COPY src /usr/src/myapp/src COPY pom.xml /usr/src/myapp RUN mvn -f /usr/src/myapp/pom.xml clean package ENV WILDFLY_VERSION 10.1.0.Final ENV WILDFLY_HOME /usr RUN cd $WILDFLY_HOME && curl http://download.jboss.org/wildfly/$WILDFLY_VERSION/wildfly-$WILDFLY_VERSION.tar.gz | tar zx && mv $WILDFLY_HOME/wildfly-$WILDFLY_VERSION $WILDFLY_HOME/wildfly RUN cp /usr/src/myapp/target/people-1.0-SNAPSHOT.war $WILDFLY_HOME/wildfly/standalone/deployments/people.war EXPOSE 8080 CMD ["/usr/wildfly/bin/standalone.sh", "-b", "0.0.0.0"]
由Dockerfile可知:单元测试
maven:3.5-jdk-8
是基础镜像deployments
目录这个Dockefile存在这些问题:
Maven
做为基础镜像的话,还须要安装和配置WildFly。固然,也能够采用其余方式构建Docker镜像。好比,能够将Dockerfile拆分为两个。第一个Dockerfile以Maven镜像为基础镜像,用于构建应用,并将构建好的.war文件经过数据卷(volume)复制到共享的目录;第二个Dockerfile以WildFly镜像做为基础镜像,从数据卷将.war文件拷贝出来就行了。这个方法也是有问题的,由于须要维护多个Dockerfile,而且经过数据卷拷贝文件也不方便。
多步构建(multi-stage build)容许在Dockerfile中使用多个FROM
指令。两个FROM
指令之间的全部指令会生产一个中间镜像,最后一个FROM
指令以后的指令将生成最终镜像。中间镜像中的文件能够经过COPY --from=<image-number>
指令拷贝,其中image-number为镜像编号,0为第一个基础镜像。没有被拷贝的文件都不会存在于最终生成的镜像,这样能够减少镜像大小。
FROM
指令可使用as <stage-name>
来指定步骤名称(stage name):
FROM maven:3.5-jdk-8 as BUILD
这样的话,COPY指令的--from
选项可使用步骤名称代替镜像编号。
下面为示例Dockerfile:
FROM maven:3.5-jdk-8 as BUILD COPY src /usr/src/myapp/src COPY pom.xml /usr/src/myapp RUN mvn -f /usr/src/myapp/pom.xml clean package FROM jboss/wildfly:10.1.0.Final COPY --from=BUILD /usr/src/myapp/target/people-1.0-SNAPSHOT.war /opt/jboss/wildfly/standalone/deployments/people.war
由Dockerfile可知:
FROM
指令,所以为两步构建。maven:3.5-jdk-8
是第一步构建的基础镜像。这一步用于构建应用的WAR文件。这一步的名称为build
。jboss/wildfly:10.1.0.Final
是第二步构建的基础镜像。第一步构建的WAR文件经过COPY --from
指令拷贝到WildFly的deloyments
目录。**注:**Docker多步构建正在开发中,尚未正式发布。能够经过 curl -fsSL https://test.docker.com/ | sh
命令安装最新的测试版Docker试用多步构建。
使用第一个Dockerfile构建的镜像为816MB,而使用多步构建的话,镜像只有584MB。
docker-java-multistage $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE people multistage d36a4b82ad87 59 seconds ago 584MB people singlestage 13dbcf8f54f6 5 minutes ago 816MB
可知,使用多步构建能够有效减少镜像大小。
查看PR #31257,有更加详细的讨论。
欢迎加入咱们Fundebug的Docker技术交流群: 305097057。
版权声明:
转载时请注明做者Fundebug以及本文地址: