Dockerfile 怎麼寫:多階段構建 Dockerfile + docker compose 編寫提示詞(體積小、非 root、可緩存)

要把項目容器化、或者現有鏡像太大、構建太慢、啟動順序老出問題時用:生成多階段構建的 Dockerfile、.dockerignore 和 docker-compose.yml,並逐行說明每個選擇的理由與安全檢查項。

NNathaniel bigo··原創首發·AI 輔助撰寫
通用大模型 對話模型通用
你是一名負責公司容器平台的 DevOps 工程師。請幫我把下面的項目容器化,目標是:鏡像小、構建可緩存、以非 root 運行、不把密鑰打進鏡像。

## 項目情況
- 語言、框架與版本:[語言框架與版本]
- 依賴與鎖文件:[如 package-lock.json/poetry.lock]
- 構建命令與產物:[構建命令與產物目錄]
- 啟動命令與監聽端口:[啟動命令與端口]
- 需要的外部服務:[如 PostgreSQL、Redis]
- 部署目標:[本機開發/單台伺服器/K8s]
- 現有 Dockerfile 或構建報錯(沒有就寫無):
  [現有文件或報錯]

## 交付物
1. Dockerfile(多階段):依賴安裝階段 → 構建階段 → 運行階段。要求:
   - 基礎鏡像固定到具體版本標籤,說明 slim 與 alpine 的取捨(alpine 用 musl,部分 Python 包和原生擴展可能需要重新編譯);
   - 先只複製鎖文件再安裝依賴,讓依賴層可以被緩存;
   - 運行階段只保留運行所需文件,用 USER 切換到非 root 用戶;
   - CMD 用 exec 形式(JSON 數組),讓應用直接接收停止信號,並說明應用作為 PID 1 時如何優雅退出(自行處理 SIGTERM 或使用 init);
   - 構建期需要的密鑰用 BuildKit 的 secret 掛載,不寫進 ARG 或 ENV;
   - 合適時加 HEALTHCHECK。
2. .dockerignore:至少排除 .git、本地依賴目錄、構建產物、.env 和日誌。
3. docker-compose.yml:應用 + 外部服務;數據庫數據用具名卷持久化;用 healthcheck 加 depends_on 的 condition: service_healthy 控制啟動順序;配置通過 env_file 或 secrets 注入;寫上重啟策略。按現行 Compose 規範,不寫已廢棄的 version 字段。
4. 常用命令:構建、啟動、看日誌、進入容器、清理。

## 要求
- 每個關鍵指令後面用註釋說明為什麼這樣寫。
- 不確定的資訊(如產物目錄、端口)在文件裏用 TODO 標出,並在最後彙總,不要猜。
- 最後給一張自查表:鏡像大小預估、是否非 root、是否有密鑰泄露風險、緩存是否生效、時區與字符集是否需要設定。

高亮處換成你自己的內容:[語言框架與版本]、[構建命令與產物目錄]、[啟動命令與端口]、[如 PostgreSQL、Redis]、[本機開發/單台伺服器/K8s]、[現有文件或報錯]

ChatGPT Plus 充值

已被複製 0 次

使用說明

怎麼填變量:[構建命令與產物] 和 [啟動命令與端口] 是最容易寫錯的地方,從 package.json、Makefile 或現有啟動腳本里原樣抄過來。[部署目標] 選 K8s 時,健康檢查一般交給 K8s 的探針,compose 部分可以只用於本地開發。

常見坑:

  • 把 COPY . . 放在安裝依賴之前,任何源碼改動都會讓依賴層緩存失效,構建變得很慢。
  • depends_on 預設只保證容器啟動順序,不保證數據庫已經可以連接,需要配合 healthcheck 和 condition: service_healthy。
  • 用 shell 形式寫 CMD(CMD node server.js),應用收不到 SIGTERM,docker stop 要等超時後強殺;用 exec 形式時應用成為 PID 1,也要自己處理 SIGTERM(或啟用 init: true)。

追問技巧:構建失敗時把完整報錯貼回去;鏡像太大時貼 docker history <鏡像名> 的輸出,問「哪一層最大、怎麼瘦身」。

示例輸出

示例,僅供參考(Node.js 應用,節選)
dockerfile
# syntax=docker/dockerfile:1
FROM node:22-slim AS deps
WORKDIR /app
# 先只複製鎖文件:源碼改動不會讓依賴層緩存失效
COPY package.json package-lock.json ./
RUN npm ci

FROM deps AS build
COPY . .
RUN npm run build && npm prune --omit=dev

FROM node:22-slim AS runtime
ENV NODE_ENV=production
WORKDIR /app
COPY --from=build --chown=node:node /app/node_modules ./node_modules
COPY --from=build --chown=node:node /app/dist ./dist
# 官方 node 鏡像自帶非 root 用戶 node
USER node
EXPOSE 3000
# exec 形式:node 直接收到 SIGTERM;PID 1 不會執行預設退出動作,
# 所以應用裏要監聽 SIGTERM 優雅退出,或在 compose 裏設 init: true
CMD ["node", "dist/server.js"]

同款作品

用這條提示詞做出來的作品;原作者會因此獲得積分

做同款

還沒有同款,來做第一個。

Nathaniel 的更多內容

同主題

同模型

0 條評論

登入 後參與評論

還沒有評論,來搶沙發~