【问题标题】:Postgres FATAL: could not open log file permission deniedPostgres FATAL:无法打开日志文件权限被拒绝
【发布时间】:2022-01-10 22:48:59
【问题描述】:

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

这是我的 docker-compose 的 sn-p:

  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 VM 上运行它。我看到了一些答案,他们更改了主机目录的权限。那是我不想做的事情。我还看到了一些旧的 2016 年解决方法的答案。但我想知道现在是否有更优雅的解决方案。

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

【问题讨论】:

标签: postgresql docker logging permissions


【解决方案1】:

Postgres 在容器内的 UID 为 999 的名为“postgres”的用户下运行。当该用户访问您从主机绑定挂载的文件时,容器 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)访问。

【讨论】:

  • 克服此错误的最佳实践方法是什么?
  • @RuiNian 我已经更新了我的答案
  • 谢谢汉斯!当我去部署我的应用程序时,我是否需要在每个部署的 docker 主机上运行它?这很奇怪,因为我在我的 Mac 上克隆了 repo,但无论出于何种原因,它都不需要这个。 Mac 和 Linux 的行为有何不同?
  • 是的,当你像这样使用绑定挂载时,你需要给容器写入主机文件系统的权限。如果您将日志存储在 docker 卷中,则可能不需要授予访问权限。我认为它在 Mac 上是一样的,因为文件系统非常相似,afaik。但我从未在 Mac 上工作过,所以我不知道。
猜你喜欢
  • 2018-07-08
  • 1970-01-01
  • 2013-01-22
  • 1970-01-01
  • 2016-06-22
  • 2019-10-23
  • 1970-01-01
  • 2011-10-16
  • 1970-01-01
相关资源
最近更新 更多