Postgres致命错误:无法打开日志文件,权限被拒绝。

3
我正在使用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年的解决方法,但我想知道现在是否有更优雅的解决方案。
注意:直到今天早上我才遇到这个错误。出于某种原因,它上周还能工作。

Docker Hub postgres 镜像页面 的末尾有一个名为“任意 --user 注释”的部分;这样的设置对你有帮助吗? - David Maze
1个回答

5

在容器内,Postgres 运行在名为 '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 用户)可访问。


如何最好地解决这个错误? - Rui Nian
@RuiNian 我已经更新了我的回答。 - Hans Kilian
谢谢Hans!当我部署我的应用程序时,我需要在每个部署的docker主机上运行它吗?这很奇怪,因为我在我的Mac上克隆了repo,出于某种原因它不需要这样做。Mac和Linux的行为有什么不同? - Rui Nian
是的,当您使用像这样的绑定挂载时,您需要给容器权限写入主机文件系统。如果您将日志存储在Docker卷中,则可能不需要授予访问权限。我认为在Mac上应该是相同的,因为文件系统非常相似,据我所知。但是我从未在Mac上工作过,所以我不知道。 - Hans Kilian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接