web-dev-qa-db-ja.com

docker-compose up後にPostgresダンプをロードする

Docker-composeでロードしたいdump.sqlファイルがあります。

docker-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 <[email protected]>

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

ある時点でpsql my_db_name < dump.sqlのようなコマンドを実行したいと思います。このようなスクリプトをDockerfile.dbから実行すると、問題は、スクリプトがビルド後、docker-compose upの前に実行され、データベースがまだ実行されていないことです。

これを行う方法はありますか?

17
jood

https://hub.docker.com/_/postgres/ を読むと、「このイメージを拡張する」セクションでは、/ docker-entrypoint-initdb.d内の.sqlがビルド後に実行されることが説明されています。

Dockerfile.dbを次のように変更するだけです。

FROM postgres

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

そしてそれはうまくいきます!

40
jood
Sudo docker exec postgres psql -U postgres my_db_name < dump.sql
4
Valentin Kantor
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}"
1
Milso

Docker-composeが完了したら、docker psを実行すると、アクティブなdockerコンテナーのリストが表示されます。それから、コンテナーIDを取得できます。

そして、

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

0

Pg_restoreも使用できます...例:

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