docker build -t app:1.0.0 .
docker build --target runtime -t app:runtime .
docker build --build-arg VERSION=1.0.0 -t app:1.0.0 .
docker buildx build --platform linux/amd64,linux/arm64 -t app:1.0.0 --push .
docker history app:1.0.0
docker run --rm -it app:1.0.0 sh
多阶段构建:
FROM golang:1.23 AS build
WORKDIR /src
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -o /out/app .
FROM gcr.io/distroless/static-debian12
COPY --from=build /out/app /app
USER 65532:65532
ENTRYPOINT ["/app"]
| 场景 | 写法 |
|---|---|
| 利用缓存 | 先 COPY 依赖文件,再 COPY 源码 |
| 减小镜像 | 多阶段构建 + distroless/alpine |
| 非 root 运行 | USER 10001 |
| 构建参数 | ARG + --build-arg |
| 健康检查 | HEALTHCHECK CMD ... |
| 时区 | 安装 tzdata 或挂载 /etc/localtime |
| 多架构 | docker buildx build --platform |
| 忽略文件 | .dockerignore |
COPY . . 放在依赖安装之前,任何源码变更都会使缓存失效。.dockerignore,把 .git、node_modules、密钥打进镜像。latest 基础镜像,构建不可复现。ARG 中的密钥会留在镜像历史里,不要在构建参数中传密钥。RUN apt-get update 和 install 分开写,缓存导致安装旧包。COPY --from,运行阶段缺文件。