Postgres FATAL:无法打开日志文件权限被拒绝

Postgres FATAL: could not open log file permission denied

我正在 docker 中部署 postgres 并尝试输出一些日志,但是,我收到一条错误消息,指出日志文件的权限被拒绝。如果我禁用日志记录,一切正常。只有当我启用日志收集时,权限才会发生。

这是我的 docker-compose 的片段:

  postgres_db:
    image: postgres:14.1
    restart: unless-stopped
    environment:
      - POSTGRES_USER=${BP_ADMIN_USER}
      - POSTGRES_PASSWORD=${BP_ADMIN_PASSWORD}
    volumes:
      - ./admin/${BP_ENV:-dev}/database:/docker-entrypoint-initdb.d
      - ./admin/${BP_ENV:-dev}/config:/mnt/admin
      - ./data/log_db:/mnt/log
      - ./data/hist_data:/mnt/data
      - ./data/postgres:/var/lib/postgresql/data
    command: postgres -c logging_collector=on -c log_rotation_age=1d -c log_directory=/mnt/log -c log_destination='stderr' -c log_filename='postgresql-%Y-%m-%d_%H%M%S.log'
    ports:
      - "5432:5432"

错误如下:

UTC [1] FATAL:  could not open log file "/mnt/log/postgresql-2022-01-10_224118.log": Permission denied

我 运行 在 Linux Ubuntu 20-04 虚拟机上。我看到了一些答案,他们更改了主机目录的权限。那是我不想做的事情。我还看到了一些 2016 年的变通办法。但我想知道现在是否有更优雅的解决方案。

注意:直到今天早上我才收到这个错误。无论出于何种原因,它上周都在工作。

Postgres 运行s 在名为 'postgres' 的用户下,容器内的 UID 为 999。当该用户访问您从主机绑定挂载的文件时,容器 UID 需要能够访问主机上的这些文件。

您收到错误消息,因为 UID 999 无法访问您主机上的 ./data/log_db/postgresql-2022-01-10_224118.log

要允许docker用户在目录中创建文件,您可以将目录的组所有者更改为组999(即容器中postgres用户的组id)。将目录设置为所有者和组成员可以完全访问。然后在目录上设置 setgid 位,这样目录中的所有文件都将继承组所有权。

chown :999 ./data/log_db
chmod 770 ./data/log_db
chmod g+s ./data/log_db

现在您应该可以 运行 您的容器了。您会看到创建的日志文件归用户“999”所有,并且只能由该用户(和 root)访问。