Dockerfile 分段式构建

Eric 2023年07月09日 493次浏览

介绍

在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