跳到主内容
UniKit

Dockerfile 生成

按运行时(Node / Python / Go / Java / Nginx / 静态站点)生成多阶段 Dockerfile,可选非 root 用户、EXPOSE 端口与版本构建参数,并给出配套的 .dockerignore。

浏览器本地运行所有计算都在你的浏览器里完成,数据不会离开本机。

基础镜像与端口

三阶段:安装依赖 → 构建 → 运行,产物从 /app/dist 拷进运行镜像。

构建选项

预览

运行时
Node.js
端口
3000
构建阶段
3
Dockerfile
# 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"]
.dockerignore
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 容器

同类工具