zoukankan      html  css  js  c++  java
  • Dockerfile 多阶段构建

    在 Docker 17.05 版本之前,我们构建 Docker 镜像时,通常会采用两种方式:

    1. 全部放入一个 Dockerfile

    包括项目及其依赖库的编译、测试、打包等流程,这里可能会带来的一些问题:

    • 镜像层次多,镜像体积较大,部署时间变长
    • 源代码存在泄露的风险

    2. 分散到多个 Dockerfile
    另一种方式,就是我们事先在一个 Dockerfile 将项目及其依赖库编译测试打包好后,再将其拷贝到运行环境中,这种方式需要我们编写两个 Dockerfile 和一些编译脚本才能将其两个阶段自动整合起来,这种方式虽然可以很好地规避第一种方式存在的风险,但明显部署过程较复杂。

    使用多阶段构建
    为解决以上问题,Docker v17.05 开始支持多阶段构建 (multistage builds)。使用多阶段构建我们就可以很容易解决前面提到的问题,并且只需要编写一个 Dockerfile:

    例如:

    FROM golang:1.14.15-alpine3.13 as bulider
    RUN apk --no-cache add git ca-certificates
    WORKDIR /gowebssh
    COPY . .
    ENV GOPROXY https://goproxy.io,direct
    RUN CGO_ENABLED=0 GOOS=linux go build -o app main.go 
        && cp /gowebssh/app / 
    	&& cp /gowebssh/ssh_proxy_rsa.key /
    
    FROM alpine:latest as prod
    RUN apk --no-cache add ca-certificates
    WORKDIR /
    # COPY --from=nginx:latest /etc/nginx/nginx.conf /nginx.conf
    COPY --from=bulider /app .
    COPY --from=bulider /ssh_proxy_rsa.key .
    
    EXPOSE 2222
    
    ENTRYPOINT ["./app"]
    
    
    • 其实多阶段构建原理就是根据 --from=bulider 指定的镜像运行一个临时容器,然后从中拷贝出结果文件到最终需要构建的镜像,从而使最终镜像层次少,体积也不会大

    打包:

    docker build -t ssh:v1 .
    

    运行:

    docker run -d --name ssh -p 2222:2222 ssh:v1
    
  • 相关阅读:
    深入理解JVM(2)——揭开HotSpot对象创建的奥秘
    深入理解JVM(3)——垃圾收集策略详解
    深入理解JVM(4)——对象内存的分配策略
    深入理解JVM(1)——JVM内存模型
    学习 IOC 设计模式前必读:依赖注入的三种实现
    学习Struts--Chap07:Struts2文件上传和下载
    POJ2823_Sliding Window
    POJ3378_Crazy Thairs
    POJ2374_Fence Obstacle Course
    POJ3709_K-Anonymous Sequence
  • 原文地址:https://www.cnblogs.com/leffss/p/14704878.html
Copyright © 2011-2022 走看看