Docker 用户命名空间将容器中的用户映射到主机

alp*_*cod 4 postgresql namespaces docker dockerfile docker-compose

我想将容器内的用户 postgres 或 root 映射到主机上的用户 myuser。网上有很多关于这个的参考,但我不太清楚如何实现以下目标:

是否有一种简单的方法可以通过 docker-run 级别的简单命令行标志将容器内的任意用户映射到主机中的用户

将容器内的 root 用户映射到主机上的 myuser

docker run --user-remap "mysuser:root" -p 6379:6379 redis:alpine
Run Code Online (Sandbox Code Playgroud)

将容器内的 postgres 映射到主机上的 myuser

docker run -it -p 5431:5432 --user-remap "myuser:postgres" --rm -v /home/myuser/data:/var/lib/postgresql/data postgres:9.6.0
Run Code Online (Sandbox Code Playgroud)

我不想对我的所有容器应用相同的设置。因此,通过应用在 docker 守护进程级别执行此操作

sudo docker daemon --userns-remap myuser
Run Code Online (Sandbox Code Playgroud)

并更新 /etc/passwd、/etc/group、/etc/subuid、/etc/subgid 无助于解决我的问题。有没有办法在docker run阶段解决这个问题,让这些设置可以在一个容器的基础上应用。

谢谢

tha*_*tah 6

不,如果您想使用用户命名空间,目前无法为绑定安装的目录和文件重新映射用户。

基本上,您遇到的问题是用户命名空间的确切目标;防止容器内的特权用户访问主机上的文件。这可以保护您免受能够逃脱容器对主机造成损坏的进程的影响。

但是,您的目标似乎是让postgres用户访问您主机上的文件,这些文件归本地用户所有。对于这种情况,可能还有另一种方法;以uid:gid拥有主机上文件的用户身份运行容器。这可能需要对图像进行更改(因为图像中的某些部分当前是由postgres用户创建的,而当前具有不同的部分uid:gid(另请参阅此答案中有关此的一些信息)

目前,对postgres官方镜像执行此操作需要进行一些手动更改,但最近为官方postgres镜像合并了一个拉取请求,使此工作开箱即用(请参阅 参考资料docker-entrypoint.sh#L30-L41

您可以在拉取请求中找到详细信息;https://github.com/docker-library/postgres/pull/253和相关文档;https://github.com/docker-library/docs/pull/802。此更改应该很快可用,但同时您可以创建扩展官方 PostgreSQL 镜像的自定义镜像。