从 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 用户可以访问必要的文件和目录。 |
| 多阶段构建 | 可选 | 推荐。在构建阶段使用带有 dev 或 sdk 标签的镜像,在运行时阶段使用非 dev 镜像。 |
| TLS 证书 | 可能需要安装 | 默认包含标准 TLS 证书。无需安装 TLS 证书。 |
| 端口 | 以 root 身份运行时可以绑定到特权端口(1024 以下) | 默认以非 root 用户身份运行。在 Kubernetes 或早于 20.10 版本的 Docker Engine 中运行时,应用程序无法绑定到特权端口(1024 以下)。请在容器内将应用程序配置为监听 1025 或更高端口。 |
| 入口点 | 因镜像而异 | 入口点可能与 Docker 官方镜像不同。请检查入口点,并根据需要更新 Dockerfile。 |
| Shell | 所有镜像通常都提供 Shell | 运行时镜像不包含 Shell。请在构建阶段使用 dev 镜像运行 Shell 命令,然后将制品复制到运行时阶段。 |
迁移步骤
步骤 1:在 Dockerfile 中更新基础镜像
将应用程序 Dockerfile 中的基础镜像更新为强化镜像。这通常是一个标记为 dev 或 sdk 的镜像,因为它具有安装包和依赖项所需的工具。
以下 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 中的所有阶段都应使用强化镜像。虽然中间阶段通常使用标记为 dev 或 sdk 的镜像,但您的最终运行时阶段应使用运行时镜像。
利用构建阶段编译您的应用程序,并将生成的制品复制到最终运行时阶段。这可确保您的最终镜像最小且安全。
以下示例显示了具有构建阶段和运行时阶段的多阶段 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 后,构建并测试您的应用程序。如果遇到问题,请参阅 故障排除指南以了解常见问题及其解决方案。
语言特定示例
请参阅示例部分以了解语言特定的迁移示例: