Docker上のOracleで初期化処理したい
先日立てたOracle on Dockerですが、初期化処理として
・ユーザーやスキーマが作りたい
・初期データを投入したい
ということがもちろんあり、その記録です。
※追記
なお、現在は公式のOracle Dockerイメージからdocker run~初期化sqlやデータのimportができます。
Dockerfileを書いてビルド?
諦めました。
下記にソース引用しましたが、bashではなくshでの実行になるので、このコンテナだとやれることが少ないです。
結局、ボリュームマウントで初期化
~/docker/oracle/init/start-up.sh
~/docker/oracle/init/01_create_USER1.ddl
~/docker/oracle/init/02_DATA_USER1.dmp
~/docker/oracle/init/03_create_USER2.ddl
~/docker/oracle/init/04_DATA_USER2.dmp
こんな感じに初期処理が記載されたシェル (start-up.sh)と、user作成用のDDLとdmpファイルを用意して ~/docker/oracle/init 配下などに置きます。
シェルの内容は、
#!/bin/bash export ORACLE_HOME=/u01/app/oracle/product/11.2.0/xe export PATH=$ORACLE_HOME/bin:$PATH export ORACLE_SID=XE /u01/app/oracle/product/11.2.0/xe/bin/sqlplus SYS/oracle@xe as sysdba @/docker-entrypoint-initdb.d/01_create_USER1.ddl /u01/app/oracle/product/11.2.0/xe/bin/imp USER1/user1Pass@xe file=/docker-entrypoint-initdb.d/02_DATA_USER1.dmp full=y /u01/app/oracle/product/11.2.0/xe/bin/sqlplus SYS/oracle@xe as sysdba @/docker-entrypoint-initdb.d/03_create_USER2.ddl /u01/app/oracle/product/11.2.0/xe/bin/imp USER2/user2Pass@xe file=/docker-entrypoint-initdb.d/04_DATA_USER2.dmp full=y
のような感じです。
そして、実行時にボリュームマウントします。
$ docker run -d -p 10022:22 -p 11521:1521 -v ~/docker/oracle/init:/docker-entrypoint-initdb.d -e ORACLE_ALLOW_REMOTE=true --name my-oracle-container wnameless/oracle-xe-11g
docker-entrypoint-initdb.dディレクトリに置いたシェルファイルは、run時に自動実行されるように元コンテナ(wnameless/oracle-xe-11g)で設定されています。
初期化処理がsqlファイルだけで良い場合はそれを置くだけでSYSTEMユーザーで実行してくれるようになっています。(下記ソース参照)
原作者ソース
for f in /docker-entrypoint-initdb.d/*; do
case "$f" in
*.sh) echo "$0: running $f"; . "$f" ;;
*.sql) echo "$0: running $f"; echo "exit" | /u01/app/oracle/product/11.2.0/xe/bin/sqlplus "SYSTEM/oracle" @"$f"; echo ;;
*) echo "$0: ignoring $f" ;;
esac
echo
done
ミソは↓ここ↓で
*.sh) echo "$0: running $f"; . "$f" ;;
となっているのでbashではなくshで実行されるのです。
また、sqlはSYSTEMユーザーで実行されます。