【问题标题】:How to map user permissions defined in a Docker container that already exist on the host如何映射主机上已存在的 Docker 容器中定义的用户权限
【发布时间】:2018-11-11 13:35:20
【问题描述】:

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

我的理解是我需要在我的主机上创建一个具有相同uidgid 的用户和组(名称无关紧要),并将这些权限分配给我在主机上挂载的目录.

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

我的问题是,如果一个容器定义了宿主机上已经存在的权限,你如何将宿主机的权限映射到容器,而无需使用环境中的配置重新构建容器本身?

如果我对事情有误解或离题,解决此问题的正确方法是什么?

【问题讨论】:

    标签: postgresql docker permissions dockerfile


    【解决方案1】:

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

    我的问题是,如果一个容器定义了宿主机上已经存在的权限,你如何将宿主机的权限映射到容器,而无需使用环境中的配置重新构建容器本身?

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-11
      • 1970-01-01
      • 1970-01-01
      • 2023-01-24
      • 1970-01-01
      相关资源
      最近更新 更多