如何映射在主机上已存在的Docker容器中定义的用户权限

时间:2018-06-01 11:58:11

标签: postgresql docker permissions dockerfile

我想在装有卷的Docker容器中运行postgres。我按照描述here的步骤进行操作。但是,容器永远不会启动。我认为这是因为/var/lib/postgresql/data目录由用户postgres拥有uid 999,群组postgres拥有gid 999

我的理解是我需要在主机上创建一个具有相同uidgid的用户和组(名称并不重要),并将这些权限分配给目录我正在主持人。

问题是uidgid已经在我的主机上播放了。我可以从Dockerfile重建Docker镜像并修改uidgid值,但我不认为这是一个很好的长期解决方案,因为我希望能够使用官方来自Docker Hub的postgres图片。

我的问题是,如果容器定义了主机上已存在的权限,那么如何将权限从主机映射到容器而不必使用环境中的配置重建容器本身?

如果我误解了某些事情或者远离标记,那么解决这个问题的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

你对/var/lib/postgresql/data是正确的。当您运行容器时,它会在容器中将该目录中文件的所有者更改为用户postgres(用户ID为999)。如果文件已存在于已装入的卷中,则如果运行docker的用户没有正确的权限,则更改所有权可能会失败。有关docker文件所有权的绝佳解释Understanding user file ownership in docker

  

我的问题是,如果容器定义了主机上已存在的权限,那么如何将权限从主机映射到容器而不必使用环境中的配置重建容器本身?

我认为您可能正在寻找的是docker用户名称空间。 Introduction to User Namespaces in Docker Engine。它允许您修复泊坞窗卷中的权限。

对于您的特定情况,如果不希望已装入卷中的文件具有uid 999,您可以覆盖容器的入口点并更改用户uid postgres 1}}。

docker run --entrypoint="bash" postgres -c  'usermod -u 2006 postgres;exec /docker-entrypoint.sh postgres'