Docker用户命名空间将容器中的用户映射到托管

时间:2016-10-19 07:12:16

标签: postgresql docker namespaces docker-compose dockerfile

我想将用户postgres或root内容映射到主机上的用户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阶段解决此问题,以便可以逐个容器地应用这些设置。

由于

1 个答案:

答案 0 :(得分:4)

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

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

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

目前,使用postgres官方图片进行此操作需要进行一些手动更改,但最近为官方postgres图片合并了拉取请求,这使得此工作开箱即用(请参阅{{3 }})

您可以找到拉取请求的详细信息; docker-entrypoint.sh#L30-L41以及相关文档; https://github.com/docker-library/postgres/pull/253。此更改应尽快提供,但与此同时,您可以创建扩展官方PostgreSQL映像的自定义映像。