美文网首页
Docker学习(8) 生产环境的多阶段构建

Docker学习(8) 生产环境的多阶段构建

作者: August________ | 来源:发表于2019-10-28 17:18 被阅读0次

Docker学习(8) 生产环境的多阶段构建

  • 多阶段构建方式使用一个Dockerfile,其中包含多个FROM指令

  • 每一个FROM指令都是一个新的构建阶段,并且可以方便复制之前的阶段的构建。

  • 查看Dockerfile

$ cat app/Dockerfile
FROM node:latest AS storefront
WORKDIR /usr/src/atsea/app/react-app
COPY react-app .
RUN npm install
RUN npm run build

FROM maven:latest AS appserver
WORKDIR /usr/src/atsea
COPY pom.xml .
RUN mvn -B -f pom.xml -s /usr/share/maven/ref/settings-docker.xml dependency:resolve
COPY . .
RUN mvn -B -s /usr/share/maven/ref/settings-docker.xml package -DskipTests

FROM java:8-jdk-alpine
RUN adduser -Dh /home/gordon gordon
WORKDIR /static
COPY --from=storefront /usr/src/atsea/app/react-app/build/ .
WORKDIR /app
COPY --from=appserver /usr/src/atsea/target/AtSea-0.0.1-SNAPSHOT.jar .
ENTRYPOINT ["java", "-jar", "/app/AtSea-0.0.1-SNAPSHOT.jar"]
CMD ["--spring.profiles.active=postgres"]

  • 这个Dockerfile中有3个FROM指令
  • 每个FROM指令构成了一个单独的构建阶段,每个阶段的内部从0开始编码的。
    • 对每个阶段定义便于理解的名字
      • 阶段0:storefront
      • 阶段1:appserver
      • 节点2:production
  • storefront阶段:拉取了一个node:latest镜像,并设置了工作目录,复制应用代码,并使用2个RUN指令执行npm操作
  • appserver阶段:拉取一个maven:latest镜像,然后通过两个COPY和两个RUN指令,生产了4个人镜像。
  • production阶段:拉取了一个java:8-jdk-alpine镜像,创建一了一个用户,并设置了工作目录,使用COPY指令复制了目录代码,最后设置了当前应用程序为容器的启动程序。
  • *** 重点COPY --from指令从之前构建的镜像中仅复制生产环境相关的应用代码。
  • 多阶段构建的方式——仅用了一个Dockerfile
  • 构建镜像
lhf@lhf-virtual-machine:~/docker/atsea-sample-shop-app-master$ cd app/
lhf@lhf-virtual-machine:~/docker/atsea-sample-shop-app-master/app$ ls -l
总用量 24
-rw-rw-r-- 1 lhf lhf  682 10月 23 23:10 Dockerfile
-rw-rw-r-- 1 lhf lhf  683 10月 23 23:10 Dockerfile-dev
-rw-rw-r-- 1 lhf lhf 4365 10月 23 23:10 pom.xml
drwxrwxr-x 4 lhf lhf 4096 10月 23 23:11 react-app
drwxrwxr-x 4 lhf lhf 4096 10月 23 23:11 src
lhf@lhf-virtual-machine:~/docker/atsea-sample-shop-app-master/app$ docker image build -t multi:stage .
Step 1/19 : FROM node:latest AS storefront
 ---> 4ac0e1872789
Step 2/19 : WORKDIR /usr/src/atsea/app/react-app
 ---> Using cache
 ---> b9728f13a661
Step 3/19 : COPY react-app .
 ---> Using cache
 ---> e79a9b60992a
Step 4/19 : RUN npm install
 ---> Using cache
 ---> 294570d35b0f
Step 5/19 : RUN npm run build
 ---> Using cache
 ---> 639a8715b042
Step 6/19 : FROM maven:latest AS appserver
 ---> 3b2476ab3d10
Step 7/19 : WORKDIR /usr/src/atsea
 ---> Using cache
 ---> 8f896d50c8c9
Step 8/19 : COPY pom.xml .
 ---> Using cache
 ---> 8fe77cdbcf9f
Step 9/19 : RUN mvn -B -f pom.xml -s /usr/share/maven/ref/settings-docker.xml dependency:resolve
 ---> Running in 8368281852da

  • 多阶段构建是docker17.05版本新增的特性,用于构建精简的生产环境的镜像。

最佳实践

利用构建缓存

  • 第一次构建的内容能够被缓存下来,并被后来构建的过程复用。

合并镜像

  • Docker会遵循正常的方式构建镜像,但之后会增加一个额外的步骤,将所有的内容合并到一个镜像当中。

使用no-install-recommends

  • 在构建linux镜像的时候,使用APT包管理器,执行apt-get install 命令增加no-install-recommends参数,确保APT仅按照核心依赖。

相关文章

网友评论

      本文标题:Docker学习(8) 生产环境的多阶段构建

      本文链接:https://www.haomeiwen.com/subject/bhwbvctx.html