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仅按照核心依赖。
网友评论