我正在寻找构建代表已经存在的公司数据库的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来做到这一点。
答案 0 :(得分:36)
根据官方PostreSQL Docker映像的usage guide,您只需要:
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卷,所以这就是我做的
Dockerfile:
FROM postgres
WORKDIR /docker-entrypoint-initdb.d
ADD psql_dump.sql /docker-entrypoint-initdb.d
EXPOSE 5432
然后运行它并创建新的本地目录,其中包含从“psql_dump.sql”文件填充后的postgres数据:docker cp mypg:/var/lib/postgresql/data ./postgres-data
将数据复制到临时数据文件夹,然后启动一个新的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。 它仍然使用泊坞窗卷。