Share feedback
Answers are generated based on the documentation.

从 Alpine 或 Debian 迁移

Docker 强化镜像 (DHI) 提供基于 Alpine 和基于 Debian 的变体。在许多情况下,从基于这些发行版的其他镜像迁移,只需在 Dockerfile 中更改基础镜像即可。

本指南帮助您将现有的基于 Alpine 或 Debian 的 Docker 官方镜像 (DOI) 迁移到 DHI。

如果您当前使用的是基于 Debian 的 Docker 官方镜像,请迁移到基于 Debian 的 DHI 变体。如果您使用的是基于 Alpine 的镜像,请迁移到基于 Alpine 的 DHI 变体。这可以最大限度地减少迁移过程中对包管理和依赖项的更改。

主要差异

从非强化镜像迁移到 DHI 时,请注意以下主要差异:

项目 非强化镜像 Docker 强化镜像
包管理 所有镜像通常都提供包管理器。 包管理器通常仅在带有 dev 标签的镜像中提供。运行时镜像不包含包管理器。请使用多阶段构建,并将必要的制品从构建阶段复制到运行时阶段。
非 root 用户 默认通常以 root 身份运行 运行时变体默认以非 root 用户身份运行。确保非 root 用户可以访问必要的文件和目录。
多阶段构建 可选 推荐。在构建阶段使用带有 devsdk 标签的镜像,在运行时阶段使用非 dev 镜像。
TLS 证书 可能需要安装 默认包含标准 TLS 证书。无需安装 TLS 证书。
端口 以 root 身份运行时可以绑定到特权端口(1024 以下) 默认以非 root 用户身份运行。在 Kubernetes 或早于 20.10 版本的 Docker Engine 中运行时,应用程序无法绑定到特权端口(1024 以下)。请在容器内将应用程序配置为监听 1025 或更高端口。
入口点 因镜像而异 入口点可能与 Docker 官方镜像不同。请检查入口点,并根据需要更新 Dockerfile。
Shell 所有镜像通常都提供 Shell 运行时镜像不包含 Shell。请在构建阶段使用 dev 镜像运行 Shell 命令,然后将制品复制到运行时阶段。

迁移步骤

步骤 1:在 Dockerfile 中更新基础镜像

将应用程序 Dockerfile 中的基础镜像更新为强化镜像。这通常是一个标记为 devsdk 的镜像,因为它具有安装包和依赖项所需的工具。

以下 Dockerfile 中的 diff 片段示例显示了旧基础镜像被新的强化镜像替换的情况。

Note

您必须向 dhi.io 进行身份验证才能拉取 Docker 强化镜像。 请使用您的 Docker ID 凭据(与 Docker Hub 相同的用户名和密码)。如果您没有 Docker 账户,请免费创建一个

运行 docker login dhi.io 进行身份验证。

- ## 原始基础镜像
- FROM golang:1.25

+ ## 更新为使用强化基础镜像
+ FROM dhi.io/golang:1.25-debian12-dev

请注意,DHI 没有 latest 标签,以促进镜像版本控制的最佳实践。请确保为您的镜像指定适当的版本标签。要找到正确的标签,请浏览 DHI 目录中的可用标签。此外,发行版基础在标签中指定(例如 -alpine3.22-debian12),因此请确保为您的应用程序选择正确的变体。

步骤 2:在 Dockerfile 中更新运行时镜像

Note

推荐使用多阶段构建,以保持最终镜像最小且安全。支持单阶段构建,但它们包含完整的 dev 镜像,因此会导致镜像更大,攻击面更广。

为了确保您的最终镜像尽可能最小,您应该使用 多阶段构建。Dockerfile 中的所有阶段都应使用强化镜像。虽然中间阶段通常使用标记为 devsdk 的镜像,但您的最终运行时阶段应使用运行时镜像。

利用构建阶段编译您的应用程序,并将生成的制品复制到最终运行时阶段。这可确保您的最终镜像最小且安全。

以下示例显示了具有构建阶段和运行时阶段的多阶段 Dockerfile:

# 构建阶段
FROM dhi.io/golang:1.25-debian12-dev AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp

# 运行时阶段
FROM dhi.io/golang:1.25-debian12
WORKDIR /app
COPY --from=builder /app/myapp .
ENTRYPOINT ["/app/myapp"]

更新 Dockerfile 后,构建并测试您的应用程序。如果遇到问题,请参阅 故障排除指南以了解常见问题及其解决方案。

语言特定示例

请参阅示例部分以了解语言特定的迁移示例: