Docker容器中PostgreSQL的权限问题

时间:2019-05-17 14:33:00

标签: postgresql docker ubuntu docker-compose file-permissions

我正在尝试使用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手动设置目录权限,但这仅在重新启动容器之前有效。

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

3 个答案:

答案 0 :(得分:4)

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

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

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

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

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

答案 1 :(得分:0)

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

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

您可以从postgres映像here阅读docker hub上的文档。 任意-用户说明部分说明了它在此图像上下文中的工作原理。

答案 2 :(得分:-1)

为我工作:

HOST:
sudo useradd -u 999 postgres
cd /path/to/postgres/data/on/host
sudo chown 999 .