介绍
在Docker Engine 17.05 中引入了多阶段构建
在一个Dockerfile中使用多个FROM指令,每个FROM都可以使用不同的基镜像,并且每条指令都将开始新阶段构建。在多阶段构建中,我们可以将资源从一个阶段复制到另一个阶段,在最终镜像中只保留我们所需要的内容。
Dockerfile 示例
# build ui
FROM node:16 AS ui
COPY ui /src
RUN cd /src \
&& npm config set registry http://mirrors.cloud.tencent.com/npm/ \
&& npm install \
&& npm run build
# build server
FROM maven:3.6-jdk-8 AS server
COPY server /src
COPY --from=ui /src/dist /src/admin/src/main/resources/public
RUN cd /src && mvn clean install
# build image
FROM openjdk:8-jre-alpine3.9
LABEL author=Eric
COPY --from=server /src/admin/target/admin.jar /opt/app.jar
COPY application.yml /opt/config/application.yml
WORKDIR /opt
EXPOSE 8080
ENTRYPOINT ["java","-jar","app.jar", "--spring.config.location=optional:config/application.yml"]
dockerfile中 FROM
指令后添加 AS <NAME>
来命名构建阶段,以后的阶段中使用COPY --from=<NAME> /src/admin/target/admin.jar /opt/app.jar
从指定的阶段中复制文件;
通过 --from=<NAME>
指定资源来源,这里的 <NAME>
即是指阶段名称。
默认情况下构建阶段没有名称,我们可以通过整数0~N来引用,即第一个from从0开始。
构建指定阶段
构建镜像时,可以通过 --target
参数指定某个目标阶段构建。
docker build --target <NAME> -t app:v2 .
使用外部镜像
使用 COPY --from
指令从单独的镜像复制,如本地镜像名称、本地或 Dockerhub上可用的标签或标签 ID。
COPY --from <image_name>:<image_version> /etc/nginx/cnfig/default.conf ./default.conf