docker-compose不启动postgres并给出错误

时间:2020-10-28 10:30:44

标签: docker docker-compose

我真的是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对我来说不太清楚(可能是因为我不太熟悉),所以我不确定如何使用响应来解决此问题。

1 个答案:

答案 0 :(得分:1)

您已经在撰写文件的底部将dbdata定义为命名卷,但是您在每个服务中都使用了./dbdata,这是绑定安装。您可以尝试在dbwebserver服务中使用命名卷代替共享目录,如下所示:

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

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

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