ubuntu Docker容器中PostgreSQL的权限问题

l7wslrjt  于 2023-01-16  发布在  Docker
关注(0)|答案(4)|浏览(378)

我正在尝试使用PostgreSQL运行一个Docker映像,它有一个配置为持久化数据的卷。

停靠-编写.yml

version: '3.1'

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

当我启动容器时,我看到输出
正在修复现有目录/var/lib/postgresql/data的权限...确定
数据文件夹对我来说不再可读。
如果我提升自己并访问数据目录,我可以看到文件在那里。

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

我可以使用sudo chmod 755 data手动设置目录权限,但只有在重新启动容器后才能使用。
为什么会发生这种情况,我该如何解决?

b1uwtaje

b1uwtaje1#

另一个答案确实指出了问题的根本原因,但是它所指向的帮助页面并不包含解决方案。下面是我为解决这个问题而想到的方法:
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,然后使用docer-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
mum43rcc

mum43rcc2#

这是因为在postgres映像的dockerfile中写入了什么。
从第15行到第18行,您将看到使用了组999和用户999,我猜在您的主机中,它们分别Map到systemd-coredumproot
您需要知道,每当您在映像中使用用户/组时,如果uid/gid存在于您的主机中,那么它将被Map到该主机。
您可以从postgres映像here中阅读Docker hub的文档,其中有一节Arbitrary --user Notes解释了它在该映像的上下文中是如何工作的。

qjp7pelc

qjp7pelc3#

一个更容易和持久的解决办法如下:
将以下行添加到~/.bashrc

export UID=$(id -u)
export GID=$(id -g)

重新加载您的shell:

$ source ~/.bashrc

按如下所示修改docker-compose.yml

version: "3.7"
services:
  db:
    image: postgres
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
    user: "${UID}:${GID}"
    ...

Source

0yycz8jy

0yycz8jy4#

我是这么做的:

services:
    postgres:
        image: postgres:15.1
        restart: always
        environment:
            - POSTGRES_USER=my_user
            - POSTGRES_PASSWORD=my_user
            - POSTGRES_DB=my_user
        user: root
        ports:
            - "5432:5432"
        volumes:
            - /home/my_user/volumes/postgres/data:/var/lib/postgresql/data
            - /home/my_user/volumes/postgres/config:/etc/postgresql
    postgres_setup:
        image: postgres:15.1
        user: root
        volumes:
            - /home/my_user/volumes/postgres/data:/var/lib/postgresql/data
            - /home/my_user/volumes/postgres/config:/etc/postgresql
        entrypoint: [ "bash", "-c", "chmod 750 -R /var/lib/postgresql/data && chmod 750 -R /etc/postgresql"] 
        depends_on:
            - postgres
    pgadmin4:
        image: dpage/pgadmin4
        restart: always
        environment:
            - PGADMIN_DEFAULT_EMAIL=my_user@admin.com
            - PGADMIN_DEFAULT_PASSWORD=my_user
            - PGADMIN_LISTEN_ADDRESS=0.0.0.0
        user: root
        ports:
            - "5050:80"
        volumes:
            - /home/my_user/volumes/pgadmin/data:/var/lib/pgadmin
        depends_on:
            - postgres_setup

postgres_setup容器仅更改权限,然后关闭

相关问题