Dockerの中にある、postgreSQLのpostGISのDBを、丸ごとコピーする方法
1.前提
(1)"gintoyo_postgres_1 docker-entrypoint.sh Up 0.0.0.0:8910->5432/tcp" というDockerコンンポーネントが動作中であるとする。
(2)docker exec -it gintoyo_postgres_1 psql -U postgres -d ca_sim という方法で、"ca_sim"というDBに直接アクセスできるものとする。
(3)docker exec -it gintoyo_postgres_1 bash → psql -d ca_sim -p 8910 -U postgres という方法でも"ca_sim"というDBにアクセスできるものとする
2.目的
ca_sim というDBと全く同じものを、ca_sim9という名前で作る
3. 手順
(Step.1) Dockerで直接DBには入らないで、シェルでログインする
C:\Users\ebata\20210203\gintoyo>docker exec -it gintoyo_postgres_1 bash
(Step.2) シェルからDBを作成する(ここでは"ca_sim9")
root@8240d01caea2:/# createdb -U postgres ca_sim9
(Step.3) シェルからDBをコピーする(ここでは"ca_sim"→"ca_sim9") 。"-U postgres"を入れないと、"rootじゃない"等の文句を言われる
root@8240d01caea2:/# pg_dump -U postgres -Ft ca_sim | pg_restore -U postgres -d ca_sim9
これは、既にコンテナ(8240d01caea2)の中に居るので、
# psql -d ca_sim -U postgres
もしくは
# psql -d ca_sim -p 5432 -U postgres
であればアクセスできると思います(5432番:postgresのデフォルトのポート番号)。
# psql -d ca_sim -U postgres
もしくは
# psql -d ca_sim -p 5432 -U postgres
であればアクセスできると思います(5432番:postgresのデフォルトのポート番号)。
(懇意にして頂いているKさんからアドバイスを頂きました)
(Step.4) シェルから出る
root@8240d01caea2:/# exit
exit
(Step.5) Docker exec でアクセスする
C:\Users\ebata\20210203\gintoyo>docker exec -it gintoyo_postgres_1 psql -U postgres
psql (13.1 (Debian 13.1-1.pgdg100+1))
Type "help" for help.
(Step.6) "ca_sim9"が存在するか調べる
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
ca_sim | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
ca_sim9 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
(5 rows)
(Step.7) "ca_sim9"の中身を調べる
postgres=# \c ca_sim9
You are now connected to database "ca_sim9" as user "postgres".
ca_sim9=# \dt
List of relations
Schema | Name | Type | Owner
--------+------------------------+-------+----------
public | aggregate_result | table | postgres
public | area_definition | table | postgres
(中略)
public | ways | table | postgres
public | ways_vertices_pgr | table | postgres
(21 rows)
ca_sim9=# \dv
List of relations
Schema | Name | Type | Owner
--------+--------------------+------+----------
public | bus_position_view | view | postgres
(中略)
public | user_position_view | view | postgres
(5 rows)
ca_sim9=#
======= ここまで =========
この方法なら、アクセス中のDBでも、作成中のDBでも、強制的に(その時点でのDB)をコピーしてくれるようです。
以上