adding-docker:爲應用生成生產級 Docker 配置

前言

要把應用部署到服務器或 CI,容器化往往是第一步。手寫 Dockerfile 時,多階段構建、依賴緩存、.dockerignore 和 docker-compose 很容易漏項或不符合生產習慣;每次換語言棧又要重新查文檔。下面介紹 Cursor 社區精選 Skill adding-docker:在用戶提出「容器化」「加 Docker 支持」時,按固定流程識別運行時並生成一套可落地的 Docker 相關文件。

這是什麼

adding-docker 是一份可複用的 SKILL.md 指令,教 Agent 爲應用生成生產向的 Dockerfile、docker-compose 與 .dockerignore。官方說明中的定位是:Dockerize an application with a production-ready Dockerfile, docker-compose setup, and .dockerignore.

維護方是 awesome-cursor-skills 倉庫中的資源目錄,與 Cursor 文檔中的 Agent Skills 機制一致:把 SKILL.md 放到指定目錄後,Agent 會自動發現並在匹配場景下按步驟執行。該 Skill 不綁定某一雲廠商或編排平臺,產出的是通用 Docker 文件,可配合本機 docker / docker compose 或現有部署流水線使用。

核心功能

根據官方 SKILL.md,Agent 在啓用本 Skill 後大致會做這些事:

  1. 識別運行時:查看 package.json、requirements.txt、go.mod、Cargo.toml 等,判斷語言與框架。
  2. 編寫多階段 Dockerfile:以 Alpine 等小體積基礎鏡像爲主;按檢測到的框架調整構建輸出目錄、啓動命令與基礎鏡像(文檔以 Node.js 多階段爲例,含 deps / build / runner 階段)。
  3. 生成 .dockerignore:排除 node_modules、構建產物、.git、.env*、文檔等,避免把無關文件打進鏡像。
  4. 按需編寫 docker-compose.yml:當應用依賴數據庫、Redis 等時,定義 app 與依賴服務(示例含 PostgreSQL 16 Alpine、卷與 depends_on)。
  5. 可選 npm scripts:例如 docker:build、docker:run,方便本地一鍵構建與啓動。

文檔中的 Notes 還約束了幾條生產習慣:優先 Alpine 鏡像減小體積;不要把 .env 打進鏡像,改用 env_file 或運行時注入;monorepo 時在 .dockerignore 中排除無關子包;生產部署建議增加 HEALTHCHECK 指令。

安裝與啓用

awesome-cursor-skills 對 Skills 的通用說明是:將現成的 SKILL.md 複製到 .cursor/skills/(用戶級)或項目目錄中對應位置,Agent 會自動發現。

本 Skill 源文件位於倉庫路徑:

https://github.com/spencerpauly/awesome-cursor-skills/tree/main/resources/adding-docker

操作步驟可以概括爲:

  1. 打開上述目錄,獲取該 Skill 的 SKILL.md(及同目錄下若有附屬文件則一併複製)。
  2. 在本機 Cursor 的 .cursor/skills/ 下新建目錄(例如 adding-docker),放入 SKILL.md。
  3. 或在當前項目根目錄的 .cursor/skills/ 下放置,僅對該項目生效。

已抓取資料未單獨列出 Codex CLI、Claude Code 的安裝差異;若你使用其他支持 SKILL.md 的 Agent 環境,可按該環境的 Skills 目錄約定放置同一文件。觸發方式以官方描述爲準:當用戶要求 dockerize、containerize 或爲應用 add Docker support 時使用本 Skill。

典型用法

以下片段來自官方 SKILL.md,用於說明 Agent 可能生成的形態;實際路徑與命令會隨你項目棧調整。

多階段 Dockerfile(Node.js 示例節選)

官方示例從 node:20-alpine 分階段安裝依賴、構建,再在 runner 階段設置 NODE_ENV=production、暴露端口並 npm start。你需要按框架改 .next 等輸出目錄與 CMD。

FROM node:20-alpine AS base

FROM base AS deps
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci --omit=dev

FROM base AS build
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
RUN npm run build

FROM base AS runner
WORKDIR /app
ENV NODE_ENV=production
COPY --from=deps /app/node_modules ./node_modules
COPY --from=build /app/.next ./.next
COPY --from=build /app/public ./public
COPY --from=build /app/package.json ./
EXPOSE 3000
CMD ["npm", "start"]

.dockerignore 示例

減少上下文體積並避免把敏感或無關文件送入構建:

node_modules
.next
.git
.env*
*.md

帶數據庫的 docker-compose.yml 示例

應用通過 env_file: .env 讀環境變量,數據庫使用命名卷持久化:

services:
  app:
    build: .
    ports:
      - "3000:3000"
    env_file: .env
    depends_on:
      - db
  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_DB: app
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
    volumes:
      - pgdata:/var/lib/postgresql/data
volumes:
  pgdata:

可選 package.json scripts

{
  "docker:build": "docker build -t myapp .",
  "docker:run": "docker compose up"
}

在 Cursor 裏,你可以直接說明意圖,例如:「給這個 Next 項目加 Docker,需要 postgres」。Agent 在加載本 Skill 後,會先檢測棧再按上述步驟生成或修改文件;生成後仍建議你在本機執行 docker build / docker compose up 驗證。

適用場景與注意

適合誰

  • 已有可運行應用,尚未容器化,希望快速得到多階段 Dockerfile 與忽略規則的團隊或個人。
  • 需要本地一鍵拉起應用 + 數據庫等依賴,希望 docker-compose.yml 結構與官方示例一致、便於再改的場景。
  • 使用 Cursor Agent,希望通過 Skills 固定「容器化」流程,減少每次從零 prompt 的遺漏。

限制與注意

  • Skill 輸出的是模板化最佳實踐,不能替代你對鏡像安全、密鑰管理、資源限制與編排平臺的審查;示例中的數據庫密碼僅爲佔位,生產環境必須替換。
  • 官方明確要求:不要將 .env 複製進鏡像;敏感配置應通過 env_file 或運行時注入。
  • Monorepo 需額外在 .dockerignore 中排除兄弟包;Skill 在 Notes 中提醒了這一點,但具體路徑仍需結合倉庫結構人工確認。
  • 生產部署應補充 HEALTHCHECK 等指令;Skill 在 Notes 中建議添加,是否寫入最終 Dockerfile 取決於 Agent 執行與你的後續修改。

結尾

adding-docker 把「識別運行時 → 多階段 Dockerfile → .dockerignore → 可選 compose 與腳本」寫成 Agent 可重複的流程,適合作爲容器化的第一步腳手架。官方資源地址:

https://github.com/spencerpauly/awesome-cursor-skills/tree/main/resources/adding-docker

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜