对于大多数生产就绪应用程序来说,Docker 文件的大小很重要。一个缩小的 docker 镜像将运行平稳且安全。

构建图像最具挑战性的事情之一就是缩小图像大小。 Dockerfile 中的每条指令都会为映像添加一层,您需要记住在继续下一层之前清理您不需要的任何工件。要编写一个真正高效的 Dockerfile,您通常需要使用 shell 技巧和其他逻辑来保持层尽可能小,并确保每一层都具有前一层所需的工件,而没有其他任何东西。

实际上,有一个 Dockerfile 用于开发(其中包含构建应用程序所需的所有内容)和一个精简的用于生产的 Dockerfile 是很常见的,它只包含您的应用程序以及运行它所需的内容。这被称为“建造者模式”。维护两个 Dockerfile 并不理想。

现在简单理解这个

构建阶段

WORKDIR /appCOPY . ./appRUN go build -o main main.go

运行阶段

1.在第二阶段,拉取最短的docker镜像(alpine)

WORKDIR /app
  1. 将之前镜像中的二进制代码复制到工作目录 zwz 100010
COPY .env .
EXPOSE 8080CMD ["/app/main"]
Dockerfile
// Build stage
FROM golang:1.18.2-alpine3.16 AS builder 
WORKDIR /app 
COPY . . 
RUN go build -o main main.go

//Run stage
FROM alpine:3.16
WORKDIR /app 
COPY --from=builder /app/main .
//this `COPY app.env .` should not be run in production
COPY .env .
EXPOSE 8080 
CMD ["/app/main"]

更多信息请阅读官方 Docker 文档

使用多阶段构建 | Docker 文档

在我的演示应用程序中,能够从 150mb docker 容器中获得大约 20mb 的容器。这是巨大的🚀✨