【发布时间】: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_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 对我来说有点不清楚(可能是因为我不太熟悉),所以我不确定如何使用回复来解决这个问题。
【问题讨论】:
-
你在运行
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