美文网首页
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