【问题标题】:Run script after container entrypoint in docker-compose在 docker-compose 中的容器入口点之后运行脚本
【发布时间】:2017-05-15 08:40:38
【问题描述】:

我有一个 postgres:9.5.6-alpine 容器和另一个名为 web 的容器,它必须链接到它。 我想在 postgres 容器启动并执行 docker-entrypoint.sh 后在 postgres 容器中运行一个名为 create_db.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 之后运行它呢?

【问题讨论】:

  • 我认为您应该在 docker-entrypoint.sh 中添加 create_db.sh 文件的内容。这将解决您的问题。

标签: postgresql docker docker-compose


【解决方案1】:

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

您可以将数据库初始化放入容器的入口点目录:/docker-entrypoint-initdb.d。这将执行此目录中的所有*.sh*.sql 文件,并且不会触及原始command
此目录中的所有文件都会在容器创建时按字母顺序自动执行。因此,创建一个卷以将您的脚本/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复制到该文件夹​​,新建容器时会自动执行。

几个database-images看这个entrypoint-directory,非常方便。

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

【讨论】:

  • 感谢您的解释。工作正常
  • 如何在容器 START 上运行 .sh 脚本?
  • 通过COPY 或作为卷绑定添加您的shell 脚本并作为您的command 执行它。但是postgres直接支持在/docker-entrypoint-initdb下执行shell脚本(见hub.docker.com/_/postgres“初始化脚本”)
猜你喜欢
  • 2018-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多