Dockerfile 生成
按运行时(Node / Python / Go / Java / Nginx / 静态站点)生成多阶段 Dockerfile,可选非 root 用户、EXPOSE 端口与版本构建参数,并给出配套的 .dockerignore。
浏览器本地运行所有计算都在你的浏览器里完成,数据不会离开本机。
基础镜像与端口
三阶段:安装依赖 → 构建 → 运行,产物从 /app/dist 拷进运行镜像。
预览
# syntax=docker/dockerfile:1 FROM node:22-alpine AS deps WORKDIR /app COPY package.json package-lock.json ./ RUN npm ci FROM node:22-alpine AS build WORKDIR /app COPY --from=deps /app/node_modules ./node_modules COPY . . RUN npm run build FROM node:22-alpine AS runtime ENV NODE_ENV=production WORKDIR /app COPY package.json ./ RUN npm ci --omit=dev COPY --from=build /app/dist ./dist EXPOSE 3000 CMD ["node", "dist/index.js"]
node_modules dist build coverage .git .gitignore .dockerignore Dockerfile docker-compose.yml .env .env.* *.log
多阶段构建把依赖安装与源码拷贝分开:改代码不会重装依赖,运行阶段只保留产物与运行时,镜像更小、暴露面更少。
这个工具能做什么
- 新项目要容器化时先拿到一份可用的多阶段 Dockerfile,不用从零回忆 npm ci、COPY --from 这些写法。
- 把现有单阶段 Dockerfile 改成多阶段:构建工具链留在构建阶段,运行镜像只装运行时与产物,体积能小一个数量级。
- 给容器加安全基线:勾选非 root 用户后自动补上 USER 与创建用户的指令,nginx 场景换成 unprivileged 镜像。
- 同时导出配套的 .dockerignore,把 node_modules、.git、构建产物排除在构建上下文之外,加快 docker build。
示例
输入
运行时:Node.js;端口留空;未开启非 root / 构建参数;开启 .dockerignore
输出
# syntax=docker/dockerfile:1 FROM node:22-alpine AS deps WORKDIR /app COPY package.json package-lock.json ./ RUN npm ci FROM node:22-alpine AS build WORKDIR /app COPY --from=deps /app/node_modules ./node_modules COPY . . RUN npm run build FROM node:22-alpine AS runtime ENV NODE_ENV=production WORKDIR /app COPY package.json ./ RUN npm ci --omit=dev COPY --from=build /app/dist ./dist EXPOSE 3000 CMD ["node", "dist/index.js"]
端口留空时按运行时取默认值(Node 3000、Python 8000、Go 与 Java 8080、nginx 80);开启 .dockerignore 后还会额外输出一份建议的忽略清单。
常见问题
为什么要用多阶段构建?
构建工具链(node_modules、Maven、Go 编译器)只留在构建阶段,运行阶段只拷产物和运行时,镜像体积通常能小一个数量级,同时少掉编译器与源码也意味着更小的攻击面。
非 root 那几行分别是什么?
node 官方镜像自带 node 用户,所以只写 USER node;python、java 需要先 useradd 再切到 uid 10001;Go 用的 distroless 镜像里 nonroot 固定是 65532。nginx 与静态站点会换成 nginx-unprivileged 镜像并把默认端口改成 8080,因为非 root 进程不能监听 80。
构建参数 ARG 怎么用?
开启后模板会在第一个 FROM 之前声明 ARG NODE_VERSION=22 之类的变量,构建时用 docker build --build-arg NODE_VERSION=20 . 就能换基础镜像版本。ARG 声明在 FROM 之前属于全局参数,后续所有阶段都能引用。
.dockerignore 应该放在哪里?
放在 Dockerfile 同级目录,也就是构建上下文的根目录。它只决定哪些文件会被发送给 docker build,不会删除镜像里的内容;把 node_modules、.git 和构建产物排除掉能显著加快构建速度。
生成的 Dockerfile 能直接构建成功吗?
模板按官方镜像的默认约定编写:npm ci 需要 package-lock.json,Go 需要 go.mod 与 go.sum,Java 需要 pom.xml 与 src 目录。如果项目入口不同(例如是 src/server.js),改一下 COPY 与 CMD 即可。
关键词:dockerfiledockerfile generatorDockerfile 生成multi-stage builddockernode dockerfilepython dockerfilego dockerfiledockerignore容器镜像多阶段构建非 root 容器