故障排除

以下是迁移到或使用 Docker Hardened Images (DHIs) 时可能遇到的常见问题,以及推荐的解决方案。

常规调试

Docker Hardened Images 针对安全性和运行时性能进行了优化。因此,它们通常不包含 shell 或标准调试工具。对基于 DHIs 构建的容器进行故障排除的推荐方法是使用 Docker Debug

Docker Debug 允许您:

  • 将临时调试容器附加到现有容器。
  • 使用 shell 和熟悉的工具,例如 curlpsnetstatstrace
  • 在可写的临时层中根据需要安装其他工具,这些工具在会话结束后会消失。

权限

出于增强安全性考虑,DHIs 默认以非 root 用户身份运行。这可能导致访问文件或目录时出现权限问题。请确保您的应用程序文件和运行时目录归预期的 UID/GID 所有,或具有适当的权限。

要确定某个 DHI 以哪个用户身份运行,请查看 Docker Hub 上该镜像的仓库页面。有关更多信息,请参见查看镜像变体详细信息

特权端口

默认情况下,非 root 容器无法绑定到 1024 以下的端口。这由容器运行时和内核共同强制执行(尤其是在 Kubernetes 和 Docker Engine < 20.10 中)。

在容器内部,请将您的应用程序配置为监听非特权端口(1025 或更高)。例如,docker run -p 80:8080 my-image 将容器内的 8080 端口映射到主机上的 80 端口,使您无需 root 权限即可访问它。

没有 shell

运行时 DHIs 省略了 shbash 等交互式 shell。如果您的构建或工具假设存在 shell(例如用于 RUN 指令),请在早期构建阶段使用镜像的 dev 变体,并将最终产物复制到运行时镜像中。

要确定某个 DHI 是否包含 shell 以及包含哪种 shell,请查看 Docker Hub 上该镜像的仓库页面。有关更多信息,请参见查看镜像变体详细信息

此外,当您需要对正在运行的容器进行 shell 访问时,请使用 Docker Debug

入口点差异

与 Docker Official Images (DOIs) 或其他社区镜像相比,DHIs 可能定义了不同的入口点。

要确定某个 DHI 的 ENTRYPOINT 或 CMD,请查看 Docker Hub 上该镜像的仓库页面。有关更多信息,请参见查看镜像变体详细信息

没有包管理器

运行时 Docker Hardened Images 为了安全性和最小化攻击面而被精简。因此,它们不包含 apkapt 等包管理器。这意味着您无法直接在运行时镜像中安装其他软件。

如果您的构建或应用程序设置需要安装软件包(例如,编译代码、安装运行时依赖项或添加诊断工具),请在构建阶段使用镜像的 dev 变体。然后,仅将必要的产物复制到最终的运行时镜像中。