为啥Docker官方镜像不按照“最佳实践”的要求使用USER

Posted

技术标签:

【中文标题】为啥Docker官方镜像不按照“最佳实践”的要求使用USER【英文标题】:Why do Docker official images not use USER as required by "best practices"为什么Docker官方镜像不按照“最佳实践”的要求使用USER 【发布时间】:2016-03-21 17:34:29 【问题描述】:

Postgres、mariadb、mysql 不使用 USER。据说官方图像会被审查以遵守最佳实践文件,requiresUSER 在可能的情况下。为什么?

【问题讨论】:

【参考方案1】:

从根本上说,USER 在官方图像中是不可能的。它与“初学者应该能够docker run official-image bash 而无需了解--entrypoint”的要求相冲突。如果您没有 root,则无法编辑配置文件、安装诸如 strace 之类的软件包……或者特别是修复卷中的 UID。实际上,官方图像样式 被认为是 (a) 最佳实践。 (所以 Docker 用户指南应该强调以非 root 身份运行守护进程,而不是特别强调 USER)


IMO 这是一个问题。您可以从中学习的流行示例并未显示设置固定 UID 的必要性。否则,如果您使用添加另一个用户的基本映像进行更新,则必须手动干预。最佳实践说您应该考虑设置固定的 UID,但他们甚至没有显示它的示例。所以prominent 使用 USER 的simple Dockerfiles 示例没有设置固定的 UID。官方图像也没有设置固定的 UID - 假装这样不是问题 - 但随后使用 chown 暴力破解数据卷,因为它们的入口点脚本以 root 身份运行。不是很令人印象深刻。


从技术上讲,可以通过向 Dockerfile 添加更多 chown 和 UID 交换来修复官方 Dockerfile,但这似乎不可取。

我想另一种选择是路径相关的更新。也就是说,保留chown,直到每个人都完成对固定 UID 的自动更新(几个月?),然后删除它。

【讨论】:

以上是关于为啥Docker官方镜像不按照“最佳实践”的要求使用USER的主要内容,如果未能解决你的问题,请参考以下文章

Dockerfile 最佳实践

Dockerfile 最佳实践

Dockerfile 最佳实践

编写 Dockerfile 最佳实践

从安全到镜像流水线,Docker 最佳实践与反模式一览

Docker最佳实践:5个方法精简镜像