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

我想将用户postgres或容器内的根映射到主机上的用户myuser。 这里有很多关于这个在线的参考资料,但是我不太清楚如何实现以下内容:

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

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

docker run --user-remap "mysuser:root" -p 6379:6379 redis:alpine 

将容器内的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 

我不想将相同的设置应用于所有容器。 所以在docker守护进程中通过应用这样做

 sudo docker daemon --userns-remap myuser 

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

谢谢

不,如果你想使用用户名空间,目前没有办法重新映射用户的绑定挂载目录和文件。

基本上,你遇到的问题是用户命名空间的确切目标 ; 防止容器内的特权用户访问主机上的文件。 这样可以保护您不受容器损坏的过程。

不过看起来你的目标是让postgres用户访问你的主机上的文件,这些文件是由本地用户拥有的。 对于这种情况,可能有另一种方法; 运行与拥有主机上的文件的用户相同的uid:gid的容器。 这可能需要对图像进行更改(因为图像中的某些部分目前是使用postgres用户创build的,而postgres用户目前有不同的uid:gid (请参阅此答案中的某些信息)

目前,使用postgres官方图像这样做需要一些手动更改,但最近合并了官方postgres镜像的请求,这使得这个工作开箱即用(请参阅docker-entrypoint.sh#L30-L41

你可以find拉请求的细节; https://github.com/docker-library/postgres/pull/253和相关的文档; https://github.com/docker-library/docs/pull/802 。 这个改变应该很快就会出现,但同时你可以创build一个定制的图像来扩展官方的PostgreSQL镜像。