使用初始架构

时间:2016-01-12 19:04:24

标签: postgresql docker dockerfile docker-compose

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

我在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脚本的解决方案。与this solution一样。

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

然而,它给了我一个错误:

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 compose作为整个应用程序,如果在docker-compose中解决这个问题更好,我会很乐意使用基本的psql图像并使用docker compose来做到这一点。

2 个答案:

答案 0 :(得分:36)

根据官方PostreSQL Docker映像的usage guide,您只需要:

Dockerfile

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

POSTGRES_DB环境变量将指示容器在首次运行时创建my_database架构。

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

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

答案 1 :(得分:6)

正如评论中所说,如果您的架构重新创建速度很快,那么@Thomasleveil的回答非常简单。 但在我的情况下,它很慢,我想使用docker卷,所以这就是我做的

  1. 首先使用docker镜像,如@Thomasleveil一样,回答用postgres创建一个包含所有架构初始化的容器
  2. Dockerfile:

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

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

    3. 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。 它仍然使用泊坞窗卷。