Dockerfile 生成器
为 Node.js、Python、Go、Java、.NET、Rust 或静态站点生成可用于生产的 Dockerfile:多阶段构建、非 root 用户,并附带匹配的 .dockerignore。
生产环境中请固定镜像的精确版本或摘要,并定期重新构建以获取安全更新。
相关工具
查看全部什么是 Dockerfile 生成器?
为 Node.js、Python、Go、Java (Maven)、.NET (ASP.NET Core)、Rust 或 由 Nginx 提供服务的静态网站 创建遵循当前最佳实践的 Dockerfile。选项包括用于缩小镜像的多阶段构建、以非 root 用户运行、运行时版本、端口和启动命令,工具还会生成匹配的 .dockerignore。
如何使用 Dockerfile 生成器
- 选择 语言 / 技术栈。
- 设置 运行时版本(镜像标签)、端口,以及启动文件、模块、JAR 或二进制名称。
- 除非有特殊原因,请保持勾选 多阶段构建(镜像更小) 和 以非 root 用户运行。
- 把 Dockerfile 和 .dockerignore 下载到项目根目录,然后运行
docker build -t myapp .。
示例
Node.js 22, port 3000, start file dist/index.js, multi-stage, non-root, npm run build
# syntax=docker/dockerfile:1 # ---- dependencies (production only) ---- FROM node:22-alpine AS deps WORKDIR /app COPY package.json package-lock.json ./ RUN npm ci --omit=dev # ---- build ---- FROM node:22-alpine AS build WORKDIR /app COPY package.json package-lock.json ./ RUN npm ci COPY . . RUN npm run build # ---- runtime ---- FROM node:22-alpine ENV NODE_ENV=production WORKDIR /app COPY --from=deps --chown=node:node /app/node_modules ./node_modules COPY --from=build --chown=node:node /app/dist ./dist COPY --chown=node:node package.json ./ # The official Node images ship an unprivileged "node" user USER node EXPOSE 3000 CMD ["node", "dist/index.js"]
何时使用 Dockerfile 生成器
适合用合理的默认值快速把典型的 Web 服务或 API 容器化。请针对你的项目检查生成的文件:构建命令、输出目录和入口点各不相同,原生依赖可能还需要额外的系统软件包。生产构建请固定确切的镜像版本或摘要,以便可重复构建。
Dockerfile 生成器 的工作原理
每个技术栈都有针对其官方镜像编写的模板。多阶段构建在完整的 SDK 镜像中安装和编译,只把结果复制到精简的运行时镜像中:Node 在单独的阶段用 npm ci --omit=dev 安装生产依赖;Python 构建虚拟环境并复制到 python:<ver>-slim;Go 编译静态二进制(CGO_ENABLED=0、-trimpath -ldflags="-s -w")并放入 distroless/static:nonroot;Java 把 JAR 复制到仅含 JRE 的 Temurin 镜像;.NET 发布到 aspnet 运行时镜像,并使用其内置的 $APP_UID 用户;Rust 把发布版二进制复制到 debian:bookworm-slim。非 root 模式使用镜像自带的无特权用户(node、nonroot、app),或创建 UID 为 10001 的用户。依赖清单会先于源代码复制,这样只修改代码时,Docker 的层缓存会跳过重新安装。
常见用例
- 把 Node.js 或 Python API 容器化以便部署
- 用 distroless 运行时缩小 Go 服务的镜像
- 用非 root 的 Nginx 提供 React/Vue/Astro 构建产物
- 教学或审查 Dockerfile 最佳实践
安全提示
切勿把 .env 文件或凭据 COPY 到镜像中;请在运行时或通过 BuildKit 的 secret 挂载传递密钥。
常见问题
为什么要使用多阶段构建?
编译器、开发依赖和源文件都留在构建阶段,所以最终镜像更小、启动更快,并且可能含有漏洞的软件包更少。
为什么要以非 root 用户运行?
如果应用被攻破,攻击者无法在容器内获得 root 权限,这样能限制损害,并阻止某些容器逃逸技术。
.dockerignore 有什么作用?
它把 node_modules、.git 和 .env 等文件排除在构建上下文之外,使构建更快,并让密钥不进入镜像。