【问题标题】:docker-compose not starting postgres and gives errordocker-compose 没有启动 postgres 并给出错误
【发布时间】:2021-02-10 17:00:16
【问题描述】:

我对 Docker(也是 postgres)真的很陌生,并且仍在寻找自己的脚。我收到一个错误,似乎无法让我的一个 postgres 服务运行,尽管当我启动它时,我可以通过浏览器访问 pgadmin 和气流。我认为发生了某种冲突,但我不确定在哪里。我有一个docker-compose.yml 文件,它启动了几个容器,还有一个有问题的postgres,它的服务名称为db

version: '3.7'
services:
    postgres:
        image: postgres:9.6
        environment:
            - POSTGRES_USER=airflow
            - POSTGRES_PASSWORD=airflow
            - POSTGRES_DB=airflow
        logging:
            options:
                max-size: 10m
                max-file: "3"

    db:
        image: postgres:13.0-alpine
        restart: always
        environment:
            POSTGRES_DB: postgres
            POSTGRES_USER: admin_user
            POSTGRES_PASSWORD: secret_password
            # PGDATA: /var/lib/postgresql/data
        volumes:
            - ./db-data:/var/lib/postgresql/data
        ports:
            - "5433:5432"
         
    pgadmin:
        image: dpage/pgadmin4:4.27
        restart: always
        environment:
            PGADMIN_DEFAULT_EMAIL: admin_user@test_email.com
            PGADMIN_DEFAULT_PASSWORD: test_password
            PGADMIN_LISTEN_PORT: 1111
        ports:
        - "1111:1111"
        volumes:
        - pgadmin-data:/var/lib/pgadmin
        links:
        - "db:pgsql-server"

    webserver:
        image: l/custom_airflow:1.5
        container_name: l_custom_airflow
        restart: always
        depends_on:
            - postgres
        environment:
            - LOAD_EX=n
            - EXECUTOR=Local
        logging:
            options:
                max-size: 10m
                max-file: "3"
        volumes:
            - ./dags:/usr/local/airflow/dags
            - ./db-data:/usr/local/airflow/db-data
            - ./pgadmin-data:/usr/local/airflow/pgadmin-data
        ports:
            - "8080:8080"
        command: webserver
        healthcheck:
            test: ["CMD-SHELL", "[ -f /usr/local/airflow/airflow-webserver.pid ]"]
            interval: 30s
            timeout: 30s
            retries: 3

volumes:
    db-data: 
    pgadmin-data: 

相关部分是这样的:

db:
    image: postgres:13.0-alpine
    restart: always
    environment:
        POSTGRES_DB: postgres
        POSTGRES_USER: admin_user
        POSTGRES_PASSWORD: secret_password
        # PGDATA: /var/lib/postgresql/data
    volumes:
        - ./db-data:/var/lib/postgresql/data
    ports:
        - "5433:5432"
     

[我的本地机器上已经有两个版本的 postgres,我看到它们使用端口 5432 和 5433,所以看起来最新的端口是 5433。同样,我有另一个服务(气流)取决于在旧版本的 postgres 上运行,所以我假设因为首先出现它需要 5432,然后我想要的新 postgres 服务可能会默认映射到 5433 - 如果我错了请纠正我]

但是当我运行docker-compose up -d 并使用docker container ls -a 检查我的容器时,我看到这个特定的容器不断地重新启动。我运行了docker logs --tail 50 --follow --timestamps pipeline_5_db_1db 服务的容器名称),我看到以下错误:

2020-10-28T08:46:29.730973000Z chmod: /var/lib/postgresql/data: Operation not permitted                                                                                                                                    2020-10-28T08:46:30.468640800Z chmod: /var/lib/postgresql/data: Operation not permitted                                                                                                                                    2020-10-28T08:46:31.048144200Z chmod: /var/lib/postgresql/data: Operation not permitted                                                                                                                                    2020-10-28T08:46:31.803571400Z chmod: /var/lib/postgresql/data: Operation not permitted                                                                                                                                    2020-10-28T08:46:32.957604600Z chmod: /var/lib/postgresql/data: Operation not permitted                                                                                                                                    2020-10-28T08:46:34.885928500Z chmod: /var/lib/postgresql/data: Operation not permitted                                                                                                                                    2020-10-28T08:46:38.479922200Z chmod: /var/lib/postgresql/data: Operation not permitted                                                                                                                                    2020-10-28T08:46:45.384436400Z chmod: /var/lib/postgresql/data: Operation not permitted                                                                                                                                    2020-10-28T08:46:58.612202300Z chmod: /var/lib/postgresql/data: Operation not permitted 

我用谷歌搜索了错误并看到了其他一些 SO 帖子,但我看不到明确的解释。 This postthis post 对我来说有点不清楚(可能是因为我不太熟悉),所以我不确定如何使用回复来解决这个问题。

【问题讨论】:

  • 你在运行docker-compose up的目录中有db-data目录吗?目录及其内容的模式和所有者是什么(ls -la db-data 的输出)?
  • 是的,目录存在那里。 ls -la db-data 的输出是 total 0 drwxrwxrwx 1 root root 512 Oct 28 10:12 . drwxrwxrwx 1 root root 512 Oct 28 10:15 ..
  • 如果绑定的挂载目录不存在,docker 会创建它,但它会归 root 拥有,这通常很不方便,有时是个大问题。提前使用不同的所有者创建目录会有所帮助,但这实际上取决于所使用的图像。 postgres 显然做了一个 chmod,然后尝试以用户 id 70 的身份写入文件,但其他人的行为不同。

标签: docker docker-compose


【解决方案1】:

您已将dbdata 定义为撰写文件底部的命名卷,但您在每个服务中使用./dbdata,这是一个绑定挂载。您可以尝试在 dbwebserver 服务中使用命名卷而不是共享目录,如下所示:

    volumes:
        - db-data:/var/lib/postgresql/data

绑定挂载也应该可以工作,但如果挂载目录的权限不太正确,可能会很麻烦,这可能是您的问题。

上述内容也适用于pgadmin-data,其中pgadmin 服务使用命名卷,但webserver 使用绑定挂载(本地目录)。事实上,尚不清楚为什么网络服务器需要访问这些数据目录。通常,网络服务器会通过端口 5432(甚至不需要在主机上映射)连接到数据库。参见例如the bitnami/airflow docs on Docker Hub

【讨论】:

  • 谢谢,这似乎完成了这项工作。由于我正在编辑模板 docker-compose.yml(来自 github.com/puckel/docker-airflow),因此我按照您在我的 db postgres 服务中的建议进行了操作,现在它的状态为 Up!
  • 我假设网络服务器需要访问它,以便它的数据在启动和停止容器之间持续存在,我不知道使用 ./directory_namedirectory_name 之间存在差异.权限问题可能是因为我使用的是 WSL2...
  • 很高兴它的工作。 WSL2 可能会解释权限问题,我还没有尝试过。有时需要在容器之间共享文件,但在许多情况下,最好让它们通过网络进行通信,并且数据库、网络服务器、文件存储(如 Amazon S3)、键值存储(如 redis)等都是在设计时考虑到这一点的。
猜你喜欢
  • 1970-01-01
  • 2016-12-08
  • 1970-01-01
  • 1970-01-01
  • 2015-07-16
  • 1970-01-01
  • 2020-01-28
  • 1970-01-01
  • 2020-12-17
相关资源
最近更新 更多