將現有應用程式遷移到使用 Docker 強化映象
本指南幫助您將現有 Dockerfile 手動遷移到使用 Docker 強化映象 (DHI),或使用 Gordon 進行遷移。DHI 具有最小化和安全集中的特點,可能需要調整您的基礎映象、構建過程和執行時配置。
本指南側重於遷移框架映象,例如使用 Go、Python 或 Node.js 等語言從原始碼構建應用程式的映象。如果您正在遷移應用程式映象,例如資料庫、代理或其他預構建服務,許多相同的原則仍然適用。
遷移注意事項
DHI 省略了 shell 和包管理器等常用工具,以減少攻擊面。它們還預設以非 root 使用者身份執行。因此,遷移到 DHI 通常需要對 Dockerfile 進行以下更改:
專案 | 遷移說明 |
---|---|
基礎映象 | 將 Dockerfile 中的基礎映象替換為 Docker 強化映象。 |
包管理 | 用於執行時的映象不包含包管理器。僅在帶有 dev 標籤的映象中使用包管理器。利用多階段構建,並將必要的工件從構建階段複製到執行時階段。 |
非 root 使用者 | 預設情況下,用於執行時的映象以非 root 使用者身份執行。確保必要的檔案和目錄可供非 root 使用者訪問。 |
多階段構建 | 在構建階段使用帶有 dev 或 sdk 標籤的映象,在執行時使用非開發映象。 |
TLS 證書 | DHI 預設包含標準 TLS 證書。無需安裝 TLS 證書。 |
埠 | 預設情況下,用於執行時的 DHI 以非 root 使用者身份執行。因此,在 Kubernetes 或 Docker Engine 20.10 版本之前執行的應用程式無法繫結到特權埠(低於 1024)。為避免問題,請將應用程式配置為在容器內監聽埠 1025 或更高。 |
入口點 | DHI 的入口點可能與 Docker 官方映象等映象不同。檢查 DHI 的入口點,如有必要,更新您的 Dockerfile。 |
無 shell | 用於執行時的 DHI 不包含 shell。在構建階段使用開發映象執行 shell 命令,然後將工件複製到執行時階段。 |
有關更多詳細資訊和故障排除技巧,請參閱故障排除。
遷移現有應用程式
以下步驟概述了遷移過程。
步驟 1:更新 Dockerfile 中的基礎映象
將應用程式 Dockerfile 中的基礎映象更新為強化映象。這通常是一個標記為 dev
或 sdk
的映象,因為它包含安裝包和依賴項所需的工具。
以下 Dockerfile 示例差異片段顯示了舊的基礎映象已被新的強化映象替換。
- ## Original base image
- FROM golang:1.22
+ ## Updated to use hardened base image
+ FROM <your-namespace>/dhi-golang:1.22-dev
步驟 2:更新 Dockerfile 中的執行時映象
為確保您的最終映象儘可能精簡,您應該使用多階段構建。Dockerfile 中的所有階段都應使用強化映象。雖然中間階段通常使用標記為 dev
或 sdk
的映象,但您的最終執行時階段應使用執行時映象。
利用構建階段編譯您的應用程式,並將生成的工件複製到最終執行時階段。這可確保您的最終映象最小且安全。
有關如何更新 Dockerfile 的示例,請參閱Dockerfile 遷移示例部分。
Dockerfile 遷移示例
以下遷移示例顯示了遷移前和遷移後的 Dockerfile。
Go 語言示例
#syntax=docker/dockerfile:1
FROM golang:latest
WORKDIR /app
ADD . ./
RUN CGO_ENABLED=0 GOOS=linux go build -a -ldflags="-s -w" --installsuffix cgo -o main .
ENTRYPOINT ["/app/main"]
#syntax=docker/dockerfile:1
# === Build stage: Compile Go application ===
FROM <your-namespace>/dhi-golang:1-alpine3.21-dev AS builder
WORKDIR /app
ADD . ./
RUN CGO_ENABLED=0 GOOS=linux go build -a -ldflags="-s -w" --installsuffix cgo -o main .
# === Final stage: Create minimal runtime image ===
FROM <your-namespace>/dhi-golang:1-alpine3.21
WORKDIR /app
COPY --from=builder /app/main /app/main
ENTRYPOINT ["/app/main"]
Node.js 示例
#syntax=docker/dockerfile:1
FROM node:latest
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY image.jpg ./image.jpg
COPY . .
CMD ["node", "index.js"]
#syntax=docker/dockerfile:1
#=== Build stage: Install dependencies and build application ===#
FROM <your-namespace>/dhi-node:23-alpine3.21-dev AS builder
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY image.jpg ./image.jpg
COPY . .
#=== Final stage: Create minimal runtime image ===#
FROM <your-namespace>/dhi-node:23-alpine3.21
ENV PATH=/app/node_modules/.bin:$PATH
COPY --from=builder --chown=node:node /usr/src/app /app
WORKDIR /app
CMD ["index.js"]
Python 示例
#syntax=docker/dockerfile:1
FROM python:latest AS builder
ENV LANG=C.UTF-8
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
ENV PATH="/app/venv/bin:$PATH"
WORKDIR /app
RUN python -m venv /app/venv
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
FROM python:latest
WORKDIR /app
ENV PYTHONUNBUFFERED=1
ENV PATH="/app/venv/bin:$PATH"
COPY image.py image.png ./
COPY --from=builder /app/venv /app/venv
ENTRYPOINT [ "python", "/app/image.py" ]
#syntax=docker/dockerfile:1
#=== Build stage: Install dependencies and create virtual environment ===#
FROM <your-namespace>/dhi-python:3.13-alpine3.21-dev AS builder
ENV LANG=C.UTF-8
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
ENV PATH="/app/venv/bin:$PATH"
WORKDIR /app
RUN python -m venv /app/venv
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
#=== Final stage: Create minimal runtime image ===#
FROM <your-namespace>/dhi-python:3.13-alpine3.21
WORKDIR /app
ENV PYTHONUNBUFFERED=1
ENV PATH="/app/venv/bin:$PATH"
COPY image.py image.png ./
COPY --from=builder /app/venv /app/venv
ENTRYPOINT [ "python", "/app/image.py" ]
使用 Gordon
或者,您可以請求 Docker 的 AI 助手 Gordon 協助遷移您的 Dockerfile
確保 Gordon 已啟用。
在 Gordon 的工具箱中,確保 Gordon 的開發人員 MCP 工具包已啟用。
在終端中,導航到包含 Dockerfile 的目錄。
與 Gordon 開啟對話
docker ai
型別
"Migrate my dockerfile to DHI"
按照與 Gordon 的對話進行操作。Gordon 將編輯您的 Dockerfile,因此當它請求訪問檔案系統等時,鍵入
yes
以允許 Gordon 繼續。注意要了解有關 Gordon 資料保留及其可以訪問的資料的更多資訊,請參閱Gordon。
遷移完成後,您將看到成功訊息
The migration to Docker Hardened Images (DHI) is complete. The updated Dockerfile
successfully builds the image, and no vulnerabilities were detected in the final image.
The functionality and optimizations of the original Dockerfile have been preserved.
重要與任何 AI 工具一樣,您必須驗證 Gordon 的編輯並測試您的映象。