Knowledge→GROWI 移行 (2)
Visual Studio Code に PostgreSQL の Docker コンテナを追加
コーディングまでの道のりは長い。
上の記事で Visual Studio Code で Python の実行環境である Docker コンテナに接続して Python のプログラムが実行できるところまでは設定しましたが、Knowledge から移行データを抜くためのデータベース環境を作っていませんでした。
今回は Visual Studio Code に PostgreSQL の Docker コンテナを追加します。
まずは、Google で PostgreSQL の Dockerfile の雛形を探します。ありがたいことに手順が解説されているサイトがたくさん見つかります。私は下記のサイトを参考にさせていただきました。
まず、.devcontainer フォルダの直下に PostgreSQL 用の Dockerfile 等を置くフォルダを作成します。
.devcontainer/postgres
このフォルダに上のサイトを参考にして Dockerfile を作成します。
FROM postgres:12-alpine ENV LANG ja_JP.UTF-8 ENV LANGUAGE ja_JP:ja ENV LC_ALL ja_JP.UTF-8 ENV TZ JST-9
ENV は LANG だけあれば良いようですが、他のコンテナでも設定しているので、LANGUAGE, LC_ALL, TZ も設定しておきました。特に意味はないです。
このままでも PostgreSQL のコンテナは問題なく起動しますが、目的のデータベースも何もない状態なのでコンテナのビルド時に移行対象のデータベースをインポートしたい思います。ここでも Google 先生に頼ります。下記のようなサイトが見つかりました。
/docker-entrypoint-initdb.d に置かれた .sql / .sh ファイルが 1 度だけ実行されるそうです。では、/docker-entrypoint-initdb.d に置くファイルを準備します。
まず、移行元サーバーから移行元データベースのダンプを取得してきます。
$ pg_dump knowledgedb -U kbadmin >knowledgedb.dump
次にデータベース / ユーザを作成する SQL ファイルを準備します。ファイル名は createdb.sql とします。
CREATE ROLE kbadmin LOGIN PASSWORD '**********'; ALTER ROLE kbadmin SUPERUSER; create database knowledgedb;
最後にデータベース / ユーザを作成してデータをインポートするシェル (01-initdb.sh) を作成します。
#!/bin/sh PGPASSWORD=********** psql < /docker-entrypoint-initdb.d/sql/createdb.sql psql -U kbadmin -d knowledgedb < /docker-entrypoint-initdb.d/sql/knowledgedb.dump
これらのファイルを下図のように .devcontainer/postgres フォルダに配置します。
docker-compose.yml に PostgreSQL の設定を追加します。
version: '3' services: python38: restart: always build: python container_name: 'python38' working_dir: '/workspace' tty: true extra_hosts: - "fluorine.kt.asasystems.co.jp:192.168.100.78" environment: - DISPLAY=${IP_ADDR}:0.0 volumes: - ..:/workspace:cached - /tmp/.X11-unix:/tmp/.X11-unix postgres: restart: always build: postgres container_name: 'postgres12' ports: - 5433:5433 environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: ********** volumes: - ./postgres/initdb:/docker-entrypoint-initdb.d
postgres の公式 docker image は envrionement の値を読みとり初期設定を行なう機能があるそうです。私は POSTGRES_USER と POSTGRES_PASSWORD を指定しました。POSTGRES_DB を省略すると POSTGRES_USER で指定した名前と同じ名前のデータベースが作成されるそうです。
あと、volumes でデータベースを初期化するシェルのあるフォルダを /docker-entrypoint-initdb.d に割り当てます。
これで、Docker コンテナの設定は完了しました。
Visual Studio Code を起動してみます。エラーなく起動できたら Python と PostgreSQL の Docker コンテナが起動しているか確認してみます。
% docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 02ee35af85df toolsbypython_devcontainer_postgres "docker-entrypoint.s…" 22 hours ago Up 6 minutes 5432/tcp, 0.0.0.0:5433->5433/tcp postgres12 ced5581a8a4a toolsbypython_devcontainer_python38 "python3" 22 hours ago Up 6 minutes 6006/tcp python38
問題なさそうです。では、Knowledge のデータベースが作成されているかどうかを確認してみます。
まず、PostgreSQL の Docker コンテナにログインします。私は Docker コンテナにログインするのに下記のようなシェルを作成しています。
docker-shell.sh
#!/bin/sh docker exec -i -t `docker ps | grep "$1" | awk '{print $1;}'` /bin/bash
では、ログイン
% docker-shell.sh postgres bash-5.1#
データベースが作成 (インポート) されているか確認するために psql を起動してテーブルの一覧でも表示してみます。
bash-5.1# psql -U kbadmin -d knowledgedb psql (12.9) Type "help" for help. knowledgedb=# \d List of relations Schema | Name | Type | Owner --------+-------------------------------+----------+--------- public | access_logs | table | kbadmin public | access_logs_no_seq | sequence | kbadmin public | account_images | table | kbadmin public | account_images_image_id_seq | sequence | kbadmin public | activities | table | kbadmin public | activities_activity_no_seq | sequence | kbadmin public | badges | table | kbadmin public | badges_no_seq | sequence | kbadmin public | comments | table | kbadmin public | comments_comment_no_seq | sequence | kbadmin public | confirm_mail_changes | table | kbadmin public | draft_item_values | table | kbadmin public | draft_knowledges | table | kbadmin public | draft_knowledges_draft_id_seq | sequence | kbadmin public | events | table | kbadmin public | functions | table | kbadmin public | groups | table | kbadmin public | groups_group_id_seq | sequence | kbadmin public | hash_configs | table | kbadmin public | item_choices | table | kbadmin public | knowledge_edit_groups | table | kbadmin public | knowledge_edit_users | table | kbadmin public | knowledge_files | table | kbadmin public | knowledge_files_file_no_seq | sequence | kbadmin public | knowledge_groups | table | kbadmin public | knowledge_histories | table | kbadmin public | knowledge_item_values | table | kbadmin public | knowledge_tags | table | kbadmin public | knowledge_users | table | kbadmin public | knowledges | table | kbadmin public | knowledges_knowledge_id_seq | sequence | kbadmin public | ldap_configs | table | kbadmin public | like_comments | table | kbadmin public | like_comments_no_seq | sequence | kbadmin public | likes | table | kbadmin public | likes_no_seq | sequence | kbadmin public | locales | table | kbadmin public | login_histories | table | kbadmin public | mail_configs | table | kbadmin public | mail_hook_conditions | table | kbadmin public | mail_hook_ignore_conditions | table | kbadmin public | mail_hooks | table | kbadmin public | mail_hooks_hook_id_seq | sequence | kbadmin public | mail_locale_templates | table | kbadmin --More--
なんか大丈夫そうです。2, 3のテーブルについて select してみましたが中身が入っているので問題ないでしょう。