Docker Webサイトで説明されているように、PostgreSQLデータベースをバックアップ/復元しようとしていますが、データは復元されません。
データベースイメージで使用されるボリュームは次のとおりです。
VOLUME ["/etc/postgresql", "/var/log/postgresql", "/var/lib/postgresql"]
そしてCMDは:
CMD ["/usr/lib/postgresql/9.3/bin/postgres", "-D", "/var/lib/postgresql/9.3/main", "-c", "config_file=/etc/postgresql/9.3/main/postgresql.conf"]
次のコマンドでDBコンテナーを作成します。
docker run -it --name "$DB_CONTAINER_NAME" -d "$DB_IMAGE_NAME"
次に、別のコンテナを接続していくつかのデータを手動で挿入します。
docker run -it --rm --link "$DB_CONTAINER_NAME":db "$DB_IMAGE_NAME" sh -c 'exec bash'
psql -d test -h $DB_PORT_5432_TCP_ADDR
# insert some data in the db
<CTRL-D>
<CTRL-D>
次に、tarアーカイブが作成されます。
$ Sudo docker run --volumes-from "$DB_CONTAINER_NAME" --rm -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /etc/postgresql /var/log/postgresql /var/lib/postgresql
ここで、dbに使用されたコンテナを削除し、同じ名前で別のコンテナを作成し、前に挿入されたデータを復元しようとします。
$ Sudo docker run --volumes-from "$DB_CONTAINER_NAME" --rm -v $(pwd):/backup ubuntu tar xvf /backup/backup.tar
しかし、テーブルは空です、なぜデータが適切に復元されないのですか?
さて、私はこれを理解しました。 Postgresqlは、一度起動されたフォルダー/ var/lib/postgresqlに対する変更を検出しません。少なくとも、私が検出したい種類の変更は検出しません。
最初の解決策は、postgresサーバーを直接起動する代わりにbashでコンテナーを起動し、データを復元してから、サーバーを手動で起動することです。
2番目の解決策は、データコンテナーを使用することです。私はそれのポイントを前に得ませんでした、今私はします。このデータコンテナにより、postgresコンテナを開始する前にデータを復元できます。したがって、postgresサーバーが起動すると、データは既にそこにあります。
docker exec -t your-db-container pg_dumpall -c -U postgres > dump_`date +%d-%m-%Y"_"%H_%M_%S`.sql
cat your_dump.sql | docker exec -i your-db-container psql -U postgres
特定の期間内にデータベースをバックアップするpostgresバックアップコンテナも使用できると思います。
pgbackups:
container_name: Backup
image: prodrigestivill/postgres-backup-local
restart: always
volumes:
- ./backup:/backups
links:
- db:db
depends_on:
- db
environment:
- POSTGRES_Host=db
- POSTGRES_DB=${DB_NAME}
- POSTGRES_USER=${DB_USER}
- POSTGRES_PASSWORD=${DB_PASSWORD}
- POSTGRES_EXTRA_OPTS=-Z9 --schema=public --blobs
- SCHEDULE=@every 0h30m00s
- BACKUP_KEEP_DAYS=7
- BACKUP_KEEP_WEEKS=4
- BACKUP_KEEP_MONTHS=6
- HEALTHCHECK_PORT=81
別のアプローチ( docker-postgresql-workflow に基づく)
エクスポートするローカル実行中のデータベース(dockerではなく、同じアプローチが機能します):
pg_dump -F c -h localhost mydb -U postgres export.dmp
インポートするコンテナデータベース:
docker run -d -v /local/path/to/postgres:/var/lib/postgresql/data postgres #ex runs container as `CONTAINERNAME` #find via `docker ps`
docker run -it --link CONTAINERNAME:postgres --volume $PWD/:/tmp/ postgres bash -c 'exec pg_restore -h postgres -U postgres -d mydb -F c /tmp/sonar.dmp'
Db_dumpを使用してdbを復元しようとしたときに、この問題が発生しました。私は通常dbeaverを使用して復元しますが、psqlダンプを受け取ったため、Dockerコンテナを使用して復元する方法を見つけ出す必要がありました。
Forthが推奨し、Soviutが編集した方法論は、私にとってはうまくいきました。
cat your_dump.sql | docker exec -i your-db-container psql -U postgres -d dbname
(これは単一のdbダンプであり、複数のdbには名前が含まれていなかったため)
ただし、これを機能させるには、Dockerコンテナとプロジェクトが含まれているvirtualenvに移動する必要がありました。次のdockerエラーを受け取っていたため、これを理解する前に少し理解できませんでした。
read unix @->/var/run/docker.sock: read: connection reset by peer
これは、ファイル/var/lib/docker/network/files/local-kv.dbが原因である可能性があります。このステートメントの正確性はわかりません。しかし、Dockerをローカルで使用していないため、これを見ていました。そのため、Forthの回答を使用して、このファイルを探していませんでした。
次に、(プロジェクトと共に)正しいディレクトリに移動してvirtualenvをアクティブにし、受け入れられた回答を実行しました。ブーム、トップのように働いた。これが他の誰かに役立つことを願っています!