我真的是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_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帖子,但看不到明确的解释。 This post和this post对我来说不太清楚(可能是因为我不太熟悉),所以我不确定如何使用响应来解决此问题。
答案 0 :(得分:1)
您已经在撰写文件的底部将dbdata
定义为命名卷,但是您在每个服务中都使用了./dbdata
,这是绑定安装。您可以尝试在db
和webserver
服务中使用命名卷代替共享目录,如下所示:
volumes:
- db-data:/var/lib/postgresql/data
绑定安装也应该可以工作,但是如果安装目录的权限不正确,可能会很麻烦,这可能是您的问题。
以上内容也适用于pgadmin-data
服务,其中pgadmin
服务使用命名卷,而webserver
使用绑定装载(本地目录)。实际上,尚不清楚为什么Web服务器需要访问这些数据目录。通常,Web服务器将通过端口5432连接到数据库(甚至不需要将其映射到主机上)。例如参见the bitnami/airflow docs on Docker Hub。