问题描述:
我有一个使用 docker 运行 nginx 和 haproxy (以及其他容器)的网络服务。我想通过私有 docker hub 注册表提供这些 docker 镜像,因此不想在镜像中构建任何 tls 证书,以便每个客户都可以将自己的证书挂载到容器(nginx 和 haproxy)中。
为了保护 haproxy 容器,我在没有 root 权限的情况下运行它(1000 以上的端口映射到 docker-compose 中 1000 以下的端口)。 nginx 容器基于官方 nginx 镜像,因此仅在服务启动时使用 root 并随后更改为 nginx 用户。
为了进一步保护容器,我设置了 docker-remapping (使用默认的 Dockerremap 用户进行默认设置)。
问题:
tls 证书公钥和私钥以用户“nobody”的身份安装在容器中,因此 haproxy 和 nginx 容器无法读取这些文件,因为它们使用不同的(非 root)用户来读取文件。
解决方案(到目前为止):
我可以使 tls 文件变得可读,例如 644,这可行,但这是一个可怕的不安全解决方案。
我可以构建自己的 nginx 映像,就像使用 haproxy 映像一样,并将容器用户添加到无人组,以便我可以将证书权限更改为 640。这是一个丑陋的黑客行为。
删除 docker 重新映射,以便我可以在 nginx 和 haproxy 容器中挂载具有与用户相同的 uid 的证书文件。这意味着我失去了 docker-remapping 的安全性,并且证书文件需要与 haproxy 和 nginx 容器中的用户相同的 uid。
在安装过程中(以及更新基础镜像或证书文件时)在客户的服务器上构建新镜像,并将我的私有 Docker 存储库中的现有镜像作为基础镜像。我的客户服务器上的 docker 构建文件非常简单,仅用于将 ssl 证书文件复制到具有正确权限的 contsiners 中。
问题:
有没有办法将主机 uid 映射到容器内用户的 uid,以便挂载的文件具有正确的 uid?