公式サンプルを公式Dockerイメージに入れる(Oracle編)
はじめに
サンプルデータベースが欲しくなったのですが、最近は見かけないような気がします。
昔々は、scott/tiger でつないで EMP テーブルで練習するのがお約束でしたが…。
調べてみることにしました。
最初は、サンプルデータベースの場所だけの備忘録にしようと思ったのですが、ちょっとデータベースを使ったデモとかテストが必要になったので、サンプルデータベース入りの Docker イメージを作って、イメージを作る材料もイメージも公開しようと思います。
Oracle 編
MySQL には似たような記事がいくつかあります(苦笑)。
基本的には、以前の PostgreSQL の派生形(と思います)なので、同じです。
公式 Docker イメージ
オフィシャルイメージは、以下にあります。
ここから free を選んで、2.42GB!の full ではなくて 871MB の lite を選択しました。
このイメージをメンテナンスしているのが、以下です(と思います)。
GitHub のオーナーは oracle
さん(と思います)。
ここの OracleDatabase/SingleInstance/dockerfiles/23.4.0
がそれ(と思います)。
Containerfile.free の中の /docker-entrypoint-initdb.d/
などに痕跡が残っている(と思います)。
このオフィシャルイメージの Running Scripts After Setup and On Startup
に書かれています。
The Container images can be configured to run scripts after setup and on startup. Currently, .sh and .sql extensions are supported. For post-setup scripts, mount the volume /opt/oracle/scripts/setup to include scripts in this directory. For post-startup scripts, mount the volume /opt/oracle/scripts/startup to include scripts in this directory.
After the database is set up or started, the scripts in those folders are run against the database in the container. SQL scripts are run as SYSDBA, and shell scripts are run as the current user. To ensure proper order for running scripts, Oracle recommends that you prefix your scripts with a number. For example: 01_users.sql, 02_permissions.sql, and so on.
なので、Oralce では、.sql
や .sh
を /opt/oracle/scripts/startup
に置いておけば良いということです。
公式サンプル
公式サンプルは、以下にありました。
ここの 2 サンプル・スキーマのインストール
で、GitHub にたどり着きます。
今回は、Customer Orders Sample Schema を組み込むことにします。
Docker イメージを作る
本当は、作らなくても、/opt/oracle/scripts/startup/
を -v
でマウントすれば終了なんだけど、組み込んでしまった方が楽なんじゃないの?ということで作ります。
SQLファイル
Customer Orders Sample Schema をダウンロードします。
co_install.sql
がパスワードやテーブルスペースを受け取っている箇所を固定値に修正します。また、実行ディレクトリがスクリプトのディレクトリとは異なるので、呼び出しをフルパスに変更します。詳しくは末尾のリポジトリを参照ください。
Dockerfile
FROM container-registry.oracle.com/database/free:23.4.0.0-lite
RUN mkdir -p /opt/oracle/scripts/startup/co/
COPY ./customer_orders/co_install.sql /opt/oracle/scripts/startup/01.sql
COPY ./customer_orders/co_create.sql /opt/oracle/scripts/startup/co/co_create.sql
COPY ./customer_orders/co_populate.sql /opt/oracle/scripts/startup/co/co_populate.sql
コピー先を 01.sql
にしているのは、オフィシャルイメージに書いてあった Oracle recommends that you prefix your scripts with a number.
対策です。
圧縮していないのは、Oracle さんの OracleDatabase/SingleInstance/dockerfiles/23.4.0/runUserScripts.sh
が、圧縮ファイル対応をしていないからです。同じスクリプトの記述のとおり、呼び出しファイルはフラットに置くと処理されてしまうので、サブディレクトリに配置しています。
Makefile
.PHONY: build run push clean
IMAGE=docker.io/take0a/oracle-co
CONTAINER=oracle01
PASSWORD=password
build: clean
docker build . -t $(IMAGE) --no-cache
run:
docker run --name $(CONTAINER) -dit -e ORACLE_PWD=$(PASSWORD) $(IMAGE)
docker exec -it $(CONTAINER) /bin/bash
push:
docker push $(IMAGE)
clean:
docker container rm $(CONTAINER) -f
docker image rm $(IMAGE) -f
こんな感じにしておくと、コマンドを忘れて「あわわ」しなくてすみます。
Docker イメージ
以下で公開しました。
docker pull take0a/oracle-co
で pull できます。
GitHub リポジトリ
以下で公開しました。
他のデータベースのものも公開したら、少しきれいにしておきます。
おわりに
やはり、サンプルデータベースは必要ですよね。
Discussion