在docker-compose之后加载Postgres转储

时间:2016-04-21 23:10:14

标签: postgresql docker docker-compose dockerfile

我有一个dump.sql文件,我想用docker-compose加载。

搬运工-compose.yml:

services:
  postgres:
    environment:
      POSTGRES_DB: my_db_name
      POSTGRES_USER: my_name
      POSTGRES_PASSWORD: my_password
    build:
      context: .
      dockerfile: ./devops/db/Dockerfile.db

我的Dockerfile.db目前非常简单:

FROM postgres
MAINTAINER me <me@me.me>

COPY ./devops/db ./devops/db
WORKDIR ./devops/db

我想在某个时候运行像psql my_db_name < dump.sql这样的命令。如果我从Dockerfile.db运行这样的脚本,问题是脚本在构建之后但在docker-compose up之前运行,并且数据库尚未运行。

知道怎么做吗?

5 个答案:

答案 0 :(得分:26)

阅读https://hub.docker.com/_/postgres/,部分&#39;扩展此图片&#39;解释说,/ docker-entrypoint-initdb.d中的任何.sql都将在构建后执行。

我只需要将Dockerfile.db更改为:

FROM postgres

ADD ./devops/db/dummy_dump.sql /docker-entrypoint-initdb.d

它有效!

答案 1 :(得分:1)

sudo docker exec postgres psql -U postgres my_db_name < dump.sql

答案 2 :(得分:1)

CONTAINER_NAME="postgres"
DB_USER=postgres
LOCAL_DUMP_PATH="..."
docker run --name "${CONTAINER_NAME}" postgres
docker exec -i "${CONTAINER_NAME}" psql -U "${DB_USER}" < "${LOCAL_DUMP_PATH}"

答案 3 :(得分:1)

您也可以使用pg_restore ...例如:

cat {BACKUP.SQL.File} | docker exec -i {working_container_name} pg_restore \
--verbose --clean --no-acl --no-owner -U {USER} -d {YOURDATABASE}

答案 4 :(得分:0)

在docker-compose之后,执行docker ps,它将为您提供活动Docker容器的列表。由此,您可以获得容器ID。

然后

  

docker exec -i {CONTAINER_ID} psql -U {USER} <{.SQL FILE}