在docker-compose中的容器入口点之后运行脚本

我有一个postgres:9.5.6高山容器,另一个容器,名为web,必须链接到它。 我想在postgres容器中运行一个名为create_db.sh的脚本,并且已经执行了docker-entrypoint.sh,以便创build一个db和一个用户并且还原一个备份。 我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后运行它?

您正在重写原始command并且不会在此脚本中启动postgres,这就是您的数据库不可用的原因。

您可以将数据库初始化放入容器的入口点目录: /docker-entrypoint-initdb.d 。 这将执行该目录中的所有*.sh*.sql文件,并且不会触及原始command
此目录中的所有文件都将在容器创build时按照字母顺序自动执行。 因此,创build一个卷来将脚本/ sql文件添加到入口点,并让容器执行它们。 这在官方postgres文档“如何扩展这个图像”一节中有描述。

你的撰写文件然后变成这样的东西:

 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拷贝到这个文件夹中,当你创build一个新的容器时它会自动执行。

几个数据库图像观看这个入口点目录,这是非常方便的。

您的container_name: postgres似乎是多余的。