+-

我有一个postgres:9.5.6-alpine容器,另一个名为web的容器,必须链接到它.
我想在postgres容器中运行一个名为create_db.sh的脚本,并在执行了docker-entrypoint.sh之后,以便创建数据库和用户并恢复备份.
我的docker-compose.yml(postgres部分):
我想在postgres容器中运行一个名为create_db.sh的脚本,并在执行了docker-entrypoint.sh之后,以便创建数据库和用户并恢复备份.
我的docker-compose.yml(postgres部分):
postgres:
build: ./postgres
container_name: postgres
volumes:
- /shared_folder/postgresql:/var/lib/postgresql
ports:
- "5432:5432"
command: sh /home/create_db.sh
create_db.sh的内容是:
#!/bin/sh
psql -d template1 -U postgres
psql --command "CREATE USER user WITH PASSWORD 'userpassword';"
psql --command "CREATE DATABASE userdb;"
psql --command "GRANT ALL PRIVILEGES ON DATABASE userdb to user;"
psql --command "\q;"
psql -U user -d userdb -f /var/lib/postgresql/backup.sql
exit
当我运行docker-compose build然后docker-compose up我得到这个:
Attaching to postgres, web
postgres | psql: could not connect to server: No such file or directory
postgres | Is the server running locally and accepting
postgres | connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
我明白这是因为当我启动create_db.sh postgres服务器还没有准备好,但是我怎样才能在容器的docker-entrypoint.sh之后运行它?
最佳答案
您正在覆盖原始命令,并且您没有在此脚本中启动postgres,这就是您的数据库不可用的原因.
您可以将数据库初始化放入容器的入口点目录:/docker-entrypoint-initdb.d.这将执行此目录中的所有* .sh和* .sql文件,并且不会触及原始命令.
此目录中的所有文件将在创建容器时按字母顺序自动执行.因此,创建一个卷以将脚本/ sql文件添加到入口点并让容器执行它们.这在官方postgres文档的第“How to extend this image”节中有所描述.
您的撰写文件然后更改为这样的内容:
postgres:
build: ./postgres
volumes:
- /shared_folder/postgresql:/var/lib/postgresql
- ./db-init-scripts:/docker-entrypoint-initdb.d
ports:
- "5432:5432"
而本地目录,例如db-init-scripts包含初始化脚本(如果需要,可以重命名).将create_db.sh复制到此文件夹,它将在您创建新容器时自动执行.
几个数据库图像观察这个入口点目录,非常方便.
你的container_name:postgres似乎是多余的.
点击查看更多相关文章
转载注明原文:postgresql – 在docker-compose中的容器入口点之后运行脚本 - 乐贴网