docker 容器中 PostgreSQL 的权限问题

Dan*_*iel 13 postgresql ubuntu file-permissions docker docker-compose

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

docker-compose.yml

version: '3.1'

services:
  db:
    image: postgres
    restart: always
    volumes:
      - ./data:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: example
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

drwx------ 19 systemd-coredump root 4096 May 17 16:22 data
Run Code Online (Sandbox Code Playgroud)

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

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

Mar*_*CRA 6

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

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

您可以在此处从 postgres 映像阅读有关 docker hub 的文档。有一个“Arbitrary --user Notes”部分解释了它在此图像的上下文中如何工作。

  • 并不真地。问题是**为什么会发生这种情况,我该如何解决它?**(最后一句话)。我已经解释了原因,因为我相信知道问题发生的原因是解决问题的好方法。至于**如何解决它**,我添加了指向文档和部分标题的链接,您可以在其中找到解决方案。当然,我可以将解决方案复制/粘贴到此处,但很可能它在某个时间可能会过时。该文档将(应该)始终是最新的。 (2认同)

Pla*_*oth 6

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

  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
Run Code Online (Sandbox Code Playgroud)
  1. 停止容器并手动将所有权更改为您想要的 uid:gid(我将在此示例中使用 1000:1000
$ docker stop postgres
$ sudo chown -R 1000:1000 ./data 
Run Code Online (Sandbox Code Playgroud)
  1. 编辑您的 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
Run Code Online (Sandbox Code Playgroud)

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

图像文档页面上,它确实提到了/etc/passwd在提供--user选项时添加卷以在图像中将文件公开为只读的解决方案,但是,这对我使用最新图像不起作用,因为我收到以下错误. 事实上,这三个提议的解决方案都不适合我。

initdb: error: could not change permissions of directory "/var/lib/postgresql/data": Operation not permitted
Run Code Online (Sandbox Code Playgroud)