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
posted @   leffss  阅读(273)  评论(0编辑  收藏  举报
编辑推荐:
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
点击右上角即可分享
微信分享提示