Dockerfile 生成器

Dockerfile
结果

Dockerfile 属于那种看着很短、直到你想起细节才发现不简单的文件:层顺序对缓存至关重要,COPY package.json 要放在 RUN npm install 之前,而编译语言能从多阶段构建中受益。本生成器会为你选择的技术栈写出开箱即用的 Dockerfile,缓存模式从一开始就是正确的。

如何生成 Dockerfile

  1. 1

    选择技术栈

    Node.js、Python、PHP、Go 或 Rust。每个模板都会为该语言使用合适的基础镜像和正确的依赖安装命令。

  2. 2

    设置工作目录和端口

    选择 WORKDIR 以及应用监听的端口,两者都会写入生成的文件。

  3. 3

    检查 Dockerfile

    确认 EXPOSE 行和启动命令与你的应用匹配。Go 和 Rust 模板使用多阶段构建。

  4. 4

    复制 Dockerfile

    复制结果并粘贴到仓库根目录,然后构建镜像。

为什么用多阶段构建

简单的 Dockerfile 会把整套编译器工具链装进最终镜像。多阶段构建给你一个负责编译的 “builder” 阶段,以及一个只携带编译产物的最终阶段:

FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
USER node
EXPOSE 3000
CMD ["node", "dist/index.js"]

最终镜像会去掉所有开发依赖、源文件和构建缓存,镜像体积通常能缩小 60-80%。

基础镜像种类

模板在可能的情况下使用 slim 或 alpine 镜像。如果你要自行调整基础镜像,常见的选项如下:

类型 常见大小 何时选择
full 300-900 MB 开发镜像、不常见的系统依赖
slim 80-200 MB 大多数语言的生产默认选择
alpine 30-100 MB 小型镜像,注意 glibc 与 musl 的差异
distroless 20-80 MB 最高安全性;无 shell、无包管理器

层缓存规则

Docker 会缓存每一行;一旦某层发生变化,其下所有内容都会重建。按易变程度从低到高排列:

  1. FROM 基础镜像(很少变化)。
  2. 系统软件包(apt-get install),变化较少。
  3. 依赖清单(package.jsonrequirements.txtcomposer.json)。
  4. 依赖安装步骤。只在清单变化时运行。
  5. 源码复制。最繁忙的层;它之后的一切会在每次提交时重建。
  6. 编译和最终的 CMD

打破这个顺序是 CI 构建变慢最常见的原因。

安全检查清单

  • 以非 root 用户运行。 在接近末尾处设置 USER appuser(或 USER 1000)。
  • 固定版本。 python:3.12.7-slim 优于 python:3.12,后者又优于 python:latest
  • 设置明确的 WORKDIR,不要依赖 /
  • 本地文件用 COPY 而不是 ADDADD 有自动解压的副作用。
  • 添加 HEALTHCHECK,让编排器能发现卡住的进程。
  • 在同一行 RUN 中清理包缓存: apt-get install ... && rm -rf /var/lib/apt/lists/*

常见问题

slim 是更安全的默认选择,因为它仍基于 glibc,与大多数库的预编译 wheel 一致。alpine 使用 musl,偶尔会在 Python(pandas、numpy)或 Node(node-gyp 原生模块)中引发难以排查的运行时错误。只有当镜像体积很关键且你已测试过该技术栈时,才选 alpine。

需要,请添加到你的项目。没有它,Docker 会把整个仓库作为构建上下文发给守护进程:git 历史、node_modules、本地 .env 文件、测试。这既慢又浪费缓存,还会泄露机密。

可以。使用 docker buildx--platform 选项,可同时构建两种架构。模板使用的基础镜像都发布 arm64 版本。

不会。所选的技术栈、工作目录和端口仅用于在本页生成 Dockerfile,不会被保存或共享。

相关工具

此工具还提供其他语言版本