用初始模式构buildpostgres docker容器

我正在寻找代表已经存在的公司数据库的dockerfiles。 同样,我想创build一个docker文件,开始恢复一个psql转储。

我有我的psql_dump.sql. 目录。

 FROM postgres ADD . /init_data run "createdb" "--template=template0" "my_database" run "psql" "-d" "my_database" --command="create role my_admin superuser" run "psql" "my_database" "<" "init_data/psql_dump.sql" 

我认为这样做足够好。 我想避免使用.sh脚本的解决scheme。 像这个解决scheme 。

我使用template0,因为psql文档说您需要创build原始数据库中创build的相同用户,并且您需要在还原之前使用template0创build数据库。

但是,它给了我一个错误:

 createdb: could not connect to database template1: could not connect to server: No such file or directory Is the server running locally and accepting 

我也使用docker组成的整体应用程序,如果解决这个问题在docker组成更好,我会很乐意使用基本的psql图像,并使用docker撰写来做到这一点。

根据官方PostreSQL Docker镜像的使用指南 ,您只需要:

Dockerfile

 FROM postgres ENV POSTGRES_DB my_database COPY psql_dump.sql /docker-entrypoint-initdb.d/ 

POSTGRES_DB环境variables将指示容器在第一次运行时创build一个my_database模式。

在容器的/docker-entrypoint-initdb.d/中find的任何.sql文件都将被执行。

如果要执行.sh脚本,也可以在/docker-entrypoint-initdb.d/目录中提供它们。

正如在评论中所说,@Thomasleveil答案是伟大的,如果您的架构娱乐快速简单。 但在我的情况下,它是缓慢的,我想使用docker卷,所以这就是我所做的

  1. 首先在@Thomasleveil中使用docker image来创build一个包含所有scehma初始化的postgres的容器

Dockerfile:

 FROM postgres WORKDIR /docker-entrypoint-initdb.d ADD psql_dump.sql /docker-entrypoint-initdb.d EXPOSE 5432 
  1. 然后运行它并创build新的本地目录,其中包含从“psql_dump.sql”文件填充后的postgres数据: docker cp mypg:/var/lib/postgresql/data ./postgres-data

  2. 将数据复制到临时数据文件夹,然后启动一个新的postgres docker-compose容器,其容量位于新的临时数据文件夹中:

startPostgres.sh:

 rm -r ./temp-postgres-data/data mkdir -p ./temp-postgres-data/data cp -r ./postgres-data/data ./temp-postgres-data/ docker-compose -p mini-postgres-project up 

和docker-compose.yml文件是:

 version: '3' services: postgres: container_name: mini-postgres image: postgres:9.5 ports: - "5432:5432" volumes: - ./temp-postgres-data/data:/var/lib/postgresql/data 

现在,您可以在新机器上运行步骤#1和#2,或者如果您的psql_dump.sql更改。 每次你想要一个新的干净(但已经初始化)的数据库,你只能运行第3步的startPostgres.sh。 它仍然使用docker卷。