&引用;“正确”;docker中管理数据库模式的方法

&引用;“正确”;docker中管理数据库模式的方法,docker,dockerfile,Docker,Dockerfile,我正在开发一个开源应用程序,它由一个JavaWeb应用程序和一个postgresql数据库组成。理想情况下,其可部署性类似于中详述的流程: 运行一个只包含数据的容器 运行数据库容器 运行应用程序容器 是否有建议的时间来设置数据库架构?我正在考虑让数据库映像的Dockerfile在构建时创建模式,但显然postgres此时没有运行。我们在我工作的地方使用postgres和Docker,我们最终做了以下工作: # Get the schema url=$(curl -s -u ${GIT_USER}

我正在开发一个开源应用程序,它由一个JavaWeb应用程序和一个postgresql数据库组成。理想情况下,其可部署性类似于中详述的流程:

  • 运行一个只包含数据的容器
  • 运行数据库容器
  • 运行应用程序容器

  • 是否有建议的时间来设置数据库架构?我正在考虑让数据库映像的Dockerfile在构建时创建模式,但显然postgres此时没有运行。

    我们在我工作的地方使用postgres和Docker,我们最终做了以下工作:

    # Get the schema
    url=$(curl -s -u ${GIT_USER}:${GIT_PASSWORD} "${SQL_SCRIPT_URL}" | python -c 'import sys, json; print json.load(sys.stdin)["download_url"]')
    curl ${url} > db.sh
    chmod +x db.sh
    cp db.sh ./docker-entrypoint-initdb.d
    
  • 从官方Postgres repo复制Dockerfile,这样你就可以制作自己的图像
  • 修改docker-entrypoint.sh(),这是在容器启动时调用的
  • 在docker-entrypoint.sh的顶部,我输入了以下内容:

    # Get the schema
    url=$(curl -s -u ${GIT_USER}:${GIT_PASSWORD} "${SQL_SCRIPT_URL}" | python -c 'import sys, json; print json.load(sys.stdin)["download_url"]')
    curl ${url} > db.sh
    chmod +x db.sh
    cp db.sh ./docker-entrypoint-initdb.d
    
    这基本上是从Github下载一个shell脚本,用于初始化数据库的模式。我们这样做是为了管理模式的版本,所以当您启动容器时,可以通过ENV变量告诉它要使用哪个模式

    关于代码的一些注释:

  • 我们需要重构以使用私钥而不是用户凭据从Github中提取内容
  • ./docker entrypoint initdb.d目录是docker-entrypoint.sh为数据库运行init脚本的地方。您可以根据需要将文件移动到该位置。如果从Github下载不适用,请执行此操作

  • 谢谢我认为脚本是以这样一种方式编写的,即它是否在数据库已经创建时运行并不重要?我在考虑是否要重新启动DB容器。是的,如果您使用共享卷将数据库持久化到主机,那么当您重新启动数据库时,可能会收到数据库已经存在的投诉。但对于表之类的东西,您可以使用IF NOT EXISTS,这样它就不会抱怨太多我想您甚至可以做一个更好的检查来查询数据库,看看对象是否存在,如果存在,然后停止。