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

Seg*_*ult 3 postgresql docker docker-compose

我有一个postgres:9.5.6-alpine容器,另一个名为web的容器,必须链接到它.我想在启动后运行create_db.shpostgres容器中命名的脚本并执行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
Run Code Online (Sandbox Code Playgroud)

内容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
Run Code Online (Sandbox Code Playgroud)

当我跑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"?
Run Code Online (Sandbox Code Playgroud)

我明白这是因为当我启动create_db.shpostgres服务器还没有准备好,但是我怎么能docker-entrypoint.sh在容器之后运行呢?

n2o*_*n2o 6

您正在覆盖原始文件,command并且您不在此脚本中启动postgres,这就是您的数据库不可用的原因.

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

您的撰写文件然后更改为这样的内容:

postgres:
  build: ./postgres
  volumes:
    - /shared_folder/postgresql:/var/lib/postgresql
    - ./db-init-scripts:/docker-entrypoint-initdb.d
  ports:
    - "5432:5432"
Run Code Online (Sandbox Code Playgroud)

而本地目录,例如db-init-scripts,包含您的初始化脚本(如果需要,可以重命名).复制create_db.sh到此文件夹,它将在您创建新容器时自动执行.

几个数据库图像观察这个入口点目录,非常方便.

container_name: postgres似乎多余了.