ほぼ老人のプログラミング日記

定年後の平凡なサラリーマンの趣味の日記

Knowledge→GROWI 移行 (2)

Visual Studio CodePostgreSQL の Docker コンテナを追加

コーディングまでの道のりは長い。

tiger62shin.hatenablog.com

上の記事で Visual Studio CodePython の実行環境である Docker コンテナに接続して Python のプログラムが実行できるところまでは設定しましたが、Knowledge から移行データを抜くためのデータベース環境を作っていませんでした。
今回は Visual Studio CodePostgreSQL の Docker コンテナを追加します。


まずは、GooglePostgreSQL の Dockerfile の雛形を探します。ありがたいことに手順が解説されているサイトがたくさん見つかります。私は下記のサイトを参考にさせていただきました。

crudzoo.com

まず、.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 先生に頼ります。下記のようなサイトが見つかりました。

qiita.com

/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 フォルダに配置します。

f:id:tiger62shin:20220129223535p:plain

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 を起動してみます。エラーなく起動できたら PythonPostgreSQL の 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 してみましたが中身が入っているので問題ないでしょう。