故障排除
以下是您在迁移到或使用 Docker 强化镜像 (DHI) 时可能遇到的常见问题以及推荐的解决方案。
一般调试
Docker 强化镜像经过优化,可提高安全性和运行时性能。因此,它们通常不包含 Shell 或标准调试工具。建议使用 Docker Debug 来排除基于 DHI 构建的容器的故障。
Docker Debug 允许您:
- 将临时调试容器附加到现有容器。
- 使用 Shell 和熟悉的工具,例如
curl、ps、netstat和strace。 - 在会话结束后消失的可写、临时层中根据需要安装其他工具。
权限
DHI 默认以非 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
运行时 DHI 省略了交互式 Shell,例如 sh 或 bash。如果您的构建或工具假定存在 Shell(例如,对于 RUN 指令),请在较早的构建阶段使用镜像的 dev 变体,并将最终工件复制到运行时镜像中。
要了解 DHI 包含哪些 Shell(如果有),请查看 Docker Hub 上该镜像的存储库页面。有关更多信息,请参阅查看镜像变体详细信息。
此外,当您需要 Shell 访问正在运行的容器时,请使用Docker Debug。
入口点差异
与 Docker 官方镜像 (DOI) 或其他社区镜像相比,DHI 可能定义了不同的入口点。
要了解 DHI 的 ENTRYPOINT 或 CMD,请查看 Docker Hub 上该镜像的存储库页面。有关更多信息,请参阅查看镜像变体详细信息。
无软件包管理器
运行时 Docker 强化镜像经过精简,以提高安全性和最小化攻击面。因此,它们不包含软件包管理器,例如 apk 或 apt。这意味着您无法直接在运行时镜像中安装其他软件。
如果您的构建或应用程序设置需要安装软件包(例如,编译代码、安装运行时依赖项或添加诊断工具),请在构建阶段使用镜像的 dev 变体。然后,仅将必要的工件复制到最终的运行时镜像中。