如何设置PostgreSQL日志文件夹的权限 - 权限被拒绝错误

6

目前,我想为Postgres挂载日志文件夹,这样即使主机重启,日志信息也能保留。

我使用以下的docker-compose.yml文件:

version: '2'
services:
  postgres:
    image: postgres:latest
    restart: always
    environment:
        - POSTGRES_USER=postgres
        - POSTGRES_PASSWORD=55F4rGFwsXXXXXX
    ports:
      - "5432:5432"
    volumes:
      - postgres_data:/var/lib/postgresql/data
      - postgres_logs:/logs
    # Make Postgres log to a file.
    # More on logging with Postgres: https://www.postgresql.org/docs/current/static/runtime-config-logging.html
    command: postgres -c logging_collector=on -c log_destination=stderr -c log_directory=/logs

volumes:
  postgres_data:
  postgres_logs:

然而,我遇到了以下权限被拒绝的错误。
postgres_1             | 2018-02-19 09:03:45.359 UTC [1] LOG:  database system is shut down
postgres_1             | 2018-02-19 09:04:45.963 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
postgres_1             | 2018-02-19 09:04:45.963 UTC [1] LOG:  listening on IPv6 address "::", port 5432
postgres_1             | 2018-02-19 09:04:45.965 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
postgres_1             | 2018-02-19 09:04:45.972 UTC [1] FATAL:  could not open log file "/logs/postgresql-2018-02-19_090445.log": Permission denied
postgres_1             | 2018-02-19 09:04:45.974 UTC [1] LOG:  database system is shut down
postgres_1             | 2018-02-19 09:05:46.741 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
postgres_1             | 2018-02-19 09:05:46.741 UTC [1] LOG:  listening on IPv6 address "::", port 5432
postgres_1             | 2018-02-19 09:05:46.744 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
postgres_1             | 2018-02-19 09:05:46.753 UTC [1] FATAL:  could not open log file "/logs/postgresql-2018-02-19_090546.log": Permission denied
postgres_1             | 2018-02-19 09:05:46.755 UTC [1] LOG:  database system is shut down
postgres_1             | 2018-02-19 09:06:47.366 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
postgres_1             | 2018-02-19 09:06:47.366 UTC [1] LOG:  listening on IPv6 address "::", port 5432
postgres_1             | 2018-02-19 09:06:47.368 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
postgres_1             | 2018-02-19 09:06:47.375 UTC [1] FATAL:  could not open log file "/logs/postgresql-2018-02-19_090647.log": Permission denied
postgres_1             | 2018-02-19 09:06:47.377 UTC [1] LOG:  database system is shut down

有人知道我如何解决这种错误吗?

2个回答

5

第二次编辑

经过一些阅读,似乎无法按照您所需的方式进行操作。您需要在使用docker-compose声明卷时能够定义文件所有权,但这是docker引擎不支持的功能。但是有一些解决方法可以考虑,可以查看此处获取更多详细信息。

作为解决方法,您可以创建一个扩展了postgres的Dockerfile,并添加以下内容:

# ...
RUN    mkdir /logs
RUN   chown postgres:postgres /logs

编辑

经过一些试验,这个方法能够生效:

version: '2'
services:
postgres:
    image: postgres:latest
    restart: always
    environment:
        - POSTGRES_USER=postgres
        - POSTGRES_PASSWORD=55F4rGFwsXXXXXX
    ports:
    - "5432:5432"
    volumes:
    - postgres_data:/var/lib/postgresql/data
    - ./:/logs:z
    # Make Postgres log to a file.
    # More on logging with Postgres: https://www.postgresql.org/docs/current/static/runtime-config-logging.html
    command: postgres -c logging_collector=on -c log_destination=stderr -c log_directory=/logs

volumes:
postgres_data:

Translated answer

我无意中通过以下步骤让它工作起来,首先使用以下docker-compose文件运行docker-compose up:

version: '2'
services:
postgres:
    image: postgres:latest
    restart: always
    environment:
        - POSTGRES_USER=postgres
        - POSTGRES_PASSWORD=55F4rGFwsXXXXXX
    ports:
    - "5432:5432"
    volumes:
    - postgres_data:/var/lib/postgresql/data
    - postgres_logs:/logs:z
    # Make Postgres log to a file.
    # More on logging with Postgres: https://www.postgresql.org/docs/current/static/runtime-config-logging.html
    command: /bin/bash -c "mkdir -p /logs && chmod -R 777 /logs && postgres -c logging_collector=on -c log_destination=stderr -c log_directory=/logs"

volumes:
postgres_data:
postgres_logs:

出现以下错误:

postgres_1 | 不允许以“root”身份执行PostgreSQL服务器。 postgres_1 | 必须在非特权用户ID下启动服务器,以防止可能的系统安全威胁。请参阅文档以获取有关如何正确启动服务器的更多信息。

撤销更改并重新运行命令后,可以正常工作,但显然这不是一个解决方案,因此请遵循上面编辑的答案。


奇怪的东西在我的电脑上运行良好,我正在使用OSX。我重新创建了一遍,只是为了确保。 - lloiacono
在执行 docker-compose builddocker-compose up -d 命令之前,我会使用 docker-compose down -v 明确删除卷,并在此之后再次检查,使用 docker-compose logs --follow postgres - Cheok Yan Cheng
1
谢谢。但是- ./:/logs:z是映射到主机本地文件夹的。我想要的是映射到一个Docker卷。 - Cheok Yan Cheng
我明白了,我再次更新了我的答案,似乎直接使用docker-compose无法实现,但有一个可行的解决方法可能会有用。 - lloiacono
1
感谢您的提问。在 Dockerfile 中使用 RUN mkdir /postgres_logsRUN chown postgres:postgres /postgres_logs 可以解决这个问题。 - Cheok Yan Cheng
显示剩余2条评论

2
问题在主机权限上,而不是容器权限。
因此,在主机上,
   chmod -R 777 postgres_logs

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