メンチカツには醤油でしょ!!

ITエンジニア徒然 (AWS/Java/JavaScript/Google Spreadsheets/Jenkins/Mac/外部コミュニティ・勉強会レポ)

Docker上のOracleで初期化処理したい

Docker上のOracleで初期化処理したい

ryoichi0102.hatenablog.com

先日立てたOracle on Dockerですが、初期化処理として
・ユーザーやスキーマが作りたい
・初期データを投入したい
ということがもちろんあり、その記録です。

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ユーザーで実行してくれるようになっています。(下記ソース参照)

原作者ソース

github.com

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で実行されるのです。

また、sqlSYSTEMユーザーで実行されます。