🐕

公式サンプルを公式Dockerイメージに入れる(Oracle編)

2024/09/09に公開

はじめに

サンプルデータベースが欲しくなったのですが、最近は見かけないような気がします。
昔々は、scott/tiger でつないで EMP テーブルで練習するのがお約束でしたが…。
調べてみることにしました。

最初は、サンプルデータベースの場所だけの備忘録にしようと思ったのですが、ちょっとデータベースを使ったデモとかテストが必要になったので、サンプルデータベース入りの Docker イメージを作って、イメージを作る材料もイメージも公開しようと思います。

Oracle 編

MySQL には似たような記事がいくつかあります(苦笑)。
基本的には、以前の PostgreSQL の派生形(と思います)なので、同じです。
https://zenn.dev/robon/articles/6071ebdff6e2f5

公式 Docker イメージ

オフィシャルイメージは、以下にあります。
https://container-registry.oracle.com/ords/ocr/ba/database

ここから free を選んで、2.42GB!の full ではなくて 871MB の lite を選択しました。

このイメージをメンテナンスしているのが、以下です(と思います)。
https://github.com/oracle/docker-images

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 に置いておけば良いということです。

公式サンプル

公式サンプルは、以下にありました。
https://docs.oracle.com/cd/F19136_01/comsc/index.html

ここの 2 サンプル・スキーマのインストール で、GitHub にたどり着きます。
今回は、Customer Orders Sample Schema を組み込むことにします。

Docker イメージを作る

本当は、作らなくても、/opt/oracle/scripts/startup/-v でマウントすれば終了なんだけど、組み込んでしまった方が楽なんじゃないの?ということで作ります。

SQLファイル

Customer Orders Sample Schema をダウンロードします。
co_install.sql がパスワードやテーブルスペースを受け取っている箇所を固定値に修正します。また、実行ディレクトリがスクリプトのディレクトリとは異なるので、呼び出しをフルパスに変更します。詳しくは末尾のリポジトリを参照ください。

Dockerfile

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

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 イメージ

以下で公開しました。
https://hub.docker.com/r/take0a/oracle-co

docker pull take0a/oracle-co で pull できます。

GitHub リポジトリ

以下で公開しました。
https://github.com/take0a/docker-library/tree/main/oracle

他のデータベースのものも公開したら、少しきれいにしておきます。

おわりに

やはり、サンプルデータベースは必要ですよね。

GitHubで編集を提案
株式会社ROBONの技術ブログ

Discussion