docker 容器中 PostgreSQL 的权限问题

Posted

技术标签:

【中文标题】docker 容器中 PostgreSQL 的权限问题【英文标题】:Permission issue with PostgreSQL in docker container 【发布时间】:2019-10-04 21:55:30 【问题描述】:

我正在尝试使用 PostgreSQL 运行一个 docker 镜像,该镜像配置了一个用于持久数据的卷。

docker-compose.yml

version: '3.1'

services:
  db:
    image: postgres
    restart: always
    volumes:
      - ./data:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: example

当我启动容器时,我会看到输出

修复现有目录 /var/lib/postgresql/data ... 的权限...好的

数据文件夹对我来说不再可读。

如果我提升自己并访问数据目录,我可以看到文件在那里。此外,命令ls -ld data 给了我

drwx------ 19 systemd-coredump root 4096 May 17 16:22 data

我可以使用sudo chmod 755 data 手动设置目录权限,但这仅在我重新启动容器之前有效。

为什么会发生这种情况,我该如何解决?

【问题讨论】:

【参考方案1】:

另一个答案确实指出了问题的根本原因,但是它指向的帮助页面不包含解决方案。这是我想出的让这项工作适合我的方法:

    使用普通的 docker-compose 文件启动容器,这将创建带有硬编码 uid:gid (999:999) 的目录
version: '3.7'

services:
  db:
    image: postgres
    container_name: postgres
    volumes:
      - ./data:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: fake_database_user
      POSTGRES_PASSWORD: fake_database_PASSWORD
    停止容器并手动将所有权更改为所需的 uid:gid(我将在此示例中使用 1000:1000
$ docker stop postgres
$ sudo chown -R 1000:1000 ./data 
    编辑您的 docker 文件以添加所需的 uid:gid 并使用 docker-compose 重新启动它(注意 user:
version: '3.7'

services:
  db:
    image: postgres
    container_name: postgres
    volumes:
      - ./data:/var/lib/postgresql/data
    user: 1000:1000
    environment:
      POSTGRES_USER: fake_database_user
      POSTGRES_PASSWORD: fake_database_password

您不能从一开始就使用user: 的原因是,如果图像以其他用户身份运行,则无法创建数据文件。

在image documentation page 上,它确实提到了一种解决方案,即在提供--user 选项时添加卷以在图像中将/etc/passwd 文件公开为只读,但是,最新版本对我不起作用图像,因为我收到以下错误。事实上,我提出的三个解决方案都不适合我。

initdb: error: could not change permissions of directory "/var/lib/postgresql/data": Operation not permitted

【讨论】:

这是一个很好的解决方案。另一种选择是通过 Dockerfile 扩展所需的 postgres 映像,例如 this post 中的那个【参考方案2】:

这是因为 postgres 图像的dockerfile 中所写的内容。 从第 15 行到第 18 行,您将看到使用了组 999 和用户 999。我猜在您的主机中,它们分别映射到systemd-coredumproot

您需要知道,每当您在图像中使用用户/组时,如果您的主机中存在 uid/gid,那么它将被映射到它。

您可以从 postgres 图像 here 阅读 docker hub 上的文档。 Arbitrary --user Notes 部分解释了它在此图像的上下文中是如何工作的。

【讨论】:

并非如此。问题是为什么会发生这种情况,我该如何解决?(最后一句话)。我已经解释了原因,因为我相信知道为什么会出现问题是克服它的好方法。至于如何解决它,我添加了指向文档的链接和可以找到解决方案的部分标题。当然,我可以在这里复制/粘贴解决方案,但它可能会在特定时间过时。文档将(应该)始终是最新的。 没有提供解决方案,但仍然提供了有用的信息,谢谢!

以上是关于docker 容器中 PostgreSQL 的权限问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 ssl 证书和带有卷的密钥部署 postgresql docker

使用docker compose部署postgreSQL数据库

使用绑定挂载的主机目录和容器之间的 Docker 文件权限不匹配

从外部连接到 docker 容器中的 Postgresql

从 docker 容器(linux 上的 docker)访问主机 postgresql

Docker:Springboot 容器无法连接到 PostgreSql 容器连接错误