【问题标题】:How to setup volume for postgres log folder - Permission denied error如何为 postgres 日志文件夹设置卷 - 权限被拒绝错误
【发布时间】:2020-04-05 22:01:28
【问题描述】:

目前,我想为postgres挂载日志文件夹,这样即使主机重启后,日志信息仍然保留。

我用下面docker-compose.yml

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

有人知道如何解决此类错误吗?

【问题讨论】:

    标签: postgresql docker


    【解决方案1】:

    第二次编辑

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

    作为一种解决方法,您可以创建一个扩展 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:
    

    原答案

    我不小心让它工作了,首先使用这个 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 | PostgreSQL 服务器的“root”执行不是 允许。 postgres_1 |服务器必须在 防止 postgres_1 的非特权用户 ID可能的系统安全 妥协。请参阅 postgres_1 的文档 |更多信息 关于如何正确启动服务器。

    在将更改还原为命令并再次运行后,就可以了,但显然这不是一个解决方案,所以请坚持上面编辑过的答案。

    【讨论】:

    • 添加 z 标志没有帮助。仍然产生相同的权限被拒绝错误。
    • 奇怪在我的电脑上工作正常,我正在使用 osx。为了确定,我从头开始重新创建。
    • 我在执行docker-compose builddocker-compose up -d 之前通过执行docker-compose down -v 显式删除卷,之后,我再次使用docker-compose logs --follow postgres 进行检查
    • 谢谢。但是- ./:/logs:z 正在映射到主机本地文件夹。我正在寻找的是映射到 docker 卷。
    • 谢谢。在 Dockerfile 中使用RUN mkdir /postgres_logsRUN chown postgres:postgres /postgres_logs 确实可以解决问题。
    【解决方案2】:

    问题是主机中的权限,而不是容器中的权限。

    所以在主机中,

       chmod -R 777 postgres_logs
    

    【讨论】:

      猜你喜欢
      • 2011-06-11
      • 1970-01-01
      • 1970-01-01
      • 2020-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-18
      • 1970-01-01
      相关资源
      最近更新 更多