Docker 团队正在探索 AI 的应用[1],本期介绍的主要内容是 AI 生成 Dockerfile 的探讨,文中示例是基于 Node.js 项目。

让 ChatGPT 帮你写一个 Dockerfile,它会很耐心地询问你项目的具体信息——语言、框架、依赖管理方式等等。就像下图所示,因为我最近问 ChatGPT 关于 Node.js 的问题比较多,它直接推断出这是 Node.js 项目。但如果遇到其他语言的项目,它还是会老老实实问你一遍。
Docker 团队提出一个更聪明的办法:与其让用户手动交代,不如给助手配一个工具,让它直接从项目中提取这些信息。
具体怎么做?思路其实挺直白的——当助手被要求创建 Dockerfile 时,给它两条高阶指令:
- 分析项目以确定其构建方式。
- 分析完成后,创建一个 Dockerfile 来构建该项目。
与此同时,还需要给 LLM 配备两个函数:
analyze_project—— 分析项目确定构建方式write_files—— 将一组文件写入项目
[
{
"name": "analyze_project",
"description": "Analyze a project to determine how it should be built"
},
{
"name": "write_files",
"description": "write a set of files to my project",
"parameters": {
"...": "..."
}
}
]
有了这两个函数,助手就能直接在你的项目目录里生成 Dockerfile 了。但问题也随之而来——如果缺乏最佳实践指导,生成的 Dockerfile 质量可能参差不齐。
为了提升生成质量,Docker 团队整理了一套 Node.js 项目 Dockerfile 的最佳实践。比如采用三段式构建:deps(依赖下载)、build(构建)、Scout(生产镜像)。下面就是 Docker 团队助手根据这些规则生成的 Dockerfile:
# Stage 1 - Downloading dependencies
FROM node:22-slim AS deps # 选择基础镜像时,获取推荐的标签
WORKDIR /usr/src/app
COPY package*.json ./
RUN --mount=type=cache,target=/root/.npm npm ci --omit=dev
# Stage 2 - Building application
FROM deps AS build
RUN --mount=type=cache,target=/root/.npm npm ci && npm build
# Stage 3 - Using a recommended base image from Scout
FROM node:22-slim
WORKDIR /usr/src/app
COPY --from=deps /usr/src/app/node_modules ./node_modules
COPY --from=build /usr/src/app/dist ./dist
CMD [ "npm", "start" ]
AI 时代,大家都在发掘新的应用场景。Docker 团队这次瞄准的正是如何让生成式 AI 助手更聪明地写出符合最佳实践的 Dockerfile。期待这个小助手早日落地——能根据项目自动分析,一步到位生成一份靠谱的 Dockerfile。
