docker compose未启动postgres并给出错误消息
我对Docker(也是博士后)真的是个新手,但我仍能找到自己的脚印。我遇到一个错误,似乎无法运行我的postgres服务,尽管当我启动它时,我可以通过浏览器访问pgadmin和airflow。我认为有一些冲突正在发生,但我不确定发生在哪里。我有一个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 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)等在设计时都考虑到了这一点。