docker compose未启动postgres并给出错误消息

docker compose未启动postgres并给出错误消息,docker,docker-compose,Docker,Docker Compose,我对Docker(也是博士后)真的是个新手,但我仍能找到自己的脚印。我遇到一个错误,似乎无法运行我的postgres服务,尽管当我启动它时,我可以通过浏览器访问pgadmin和airflow。我认为有一些冲突正在发生,但我不确定发生在哪里。我有一个docker compose.yml文件,它启动了几个容器,还有一个postgres文件,它的服务名为db: version: '3.7' services: postgres: image: postgres:9.6

我对Docker(也是博士后)真的是个新手,但我仍能找到自己的脚印。我遇到一个错误,似乎无法运行我的postgres服务,尽管当我启动它时,我可以通过浏览器访问pgadmin和airflow。我认为有一些冲突正在发生,但我不确定发生在哪里。我有一个
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。同样,我还有另一个服务(airflow)这取决于要运行的postgres的旧版本,因此我假设,由于先运行一个版本,需要5432,然后我想要的新postgres服务可能会映射到5433作为默认值-如果我错了,请纠正我]

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

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帖子,但我看不到一个明确的解释。我有点不清楚(可能是因为我不太熟悉),所以我不确定如何使用响应来解决这个问题。

您在compose文件的底部将
dbdata
定义为一个命名卷,但您在作为绑定装载的每个服务中使用
/dbdata
。您可以尝试在
db
webserver
服务中使用命名卷而不是共享目录,如下所示:

    volumes:
        - db-data:/var/lib/postgresql/data
绑定挂载也应该可以工作,但如果挂载目录的权限不完全正确,则可能会带来麻烦,这可能是您的问题


上述内容也适用于
pgadmin数据
,其中
pgadmin
服务使用命名卷,但
webserver
使用绑定装载(本地目录)。事实上,不清楚为什么Web服务器需要访问这些数据目录。通常,Web服务器将通过端口5432(甚至不需要在主机上映射)连接到数据库。例如,请参阅。

在运行
docker compose up
的目录中是否有
db data
目录?目录及其内容(ls-la db data的输出)的模式和所有者是什么?是的,目录存在于那里。
ls-la db data
的输出为
total 0 drwxrwx 1 root root 512 Oct 28 10:12.                                                                                                                                                                                  DRWXRWX 1根根目录512十月28日10:15如果绑定挂载的目录不存在,docker将创建它,但它将归root所有,这通常是不方便的,有时是一个大问题。使用不同的所有者提前创建目录可能会有所帮助,但这实际上取决于所使用的图像。postgres one显然执行了chmod,然后尝试以用户id 70的形式编写文件,但其他人的行为不同。谢谢,这似乎已经完成了任务。因为我正在编辑一个模板docker-compose.yml(来自),所以我按照您在我的
db
postgres服务中的建议做了,现在它的状态是Up!我假设Web服务器需要访问它,以便其数据在启动和停止容器之间保持不变,并且我不知道使用
/directory\u name
directory\u name
之间有什么区别。权限问题可能会出现,因为我正在使用WSL2…很高兴它能工作。WSL2可能会用权限来解释这个问题,但我还没有尝试过。在容器之间共享文件有时是必要的,但在许多情况下,最好让它们通过网络进行通信,数据库、Web服务器、文件存储(如Amazon S3)、键值存储(如redis)等在设计时都考虑到了这一点。