環境構築にDockerを使用して、ハマったポイントがあるため書き残しておきます。
前書き
dockerイメージについては、公式で公開されているリポジトリの情報をもとに作成しています。
インストーラの入手、ビルドについては公式リポジトリを参照すれば可能なはずです。
qiitaで記事にしている方もいらっしゃるようです
@moriwakiii 様
この記事にたどり着いた皆様なら、すでにここまではなんとなく終わっているんじゃないかと。。。
永続化ボリュームの場所
永続化ボリュームの場所は、/u01/app/oracle/oradata
です
12cの場合:/opt/oracle/oradata
19cの場合:/opt/oracle/product/19c
のようです・・・コロコロ変えるなよ〇すぞ
永続化ボリュームのpermission
docker run
するときや、docker-compose up
するときなんかに永続化ボリュームとして
ローカルストレージをマウントすると思いますが、
docker run -it -d -p 1521:1521 -v ./oradata:/u01/app/oracle/oradata oracle/database:11.2.0.2-xe
その際以下のようなログが出て初期化に失敗している場合があります。
oracle11g | #####################################
oracle11g | ########### E R R O R ###############
oracle11g | DATABASE SETUP WAS NOT SUCCESSFUL!
oracle11g | Please check output for further info!
oracle11g | ########### E R R O R ###############
oracle11g | #####################################
oracle11g | The following output is now a tail of the alert.log:
oracle11g | ALTER DATABASE MOUNT
oracle11g | ORA-00210: cannot open the specified control file
oracle11g | ORA-00202: control file: '/u01/app/oracle/oradata/XE/control.dbf'
oracle11g | ORA-27037: unable to obtain file status
oracle11g | Linux-x86_64 Error: 2: No such file or directory
oracle11g | Additional information: 3
oracle11g | ORA-205 signalled during: ALTER DATABASE MOUNT...
oracle11g | Sun May 10 04:16:38 2020
oracle11g | Checker run found 1 new persistent data failures
公式issueなどにもあるのですが、
https://github.com/oracle/docker-images/issues/176
マウント元のディレクトリ(oradata)のOwnerが1000:1000
になっていないと、
操作する権限がなくてERRORになって死にます。
12c/19cなどのissueでは、chown 54321:54322
という記事も見かけますが、
11gの場合は1000:1000
ですので、イメージが完成して喜び勇んでdocker run
/docker-compose up
するまえに、
mkdir oradata/ # 永続化ボリュームマウント用のディレクトリを作成
chown 1000:1000 oradata/ # ownerを1000:1000に設定。必要に応じてsudoなどで実行してください。
をしておくと幸せになれるかもしれません。
あと、これはDocker関係ないのですが、Vagrant + Hyper-Vで作業をしていたのですが、
smbでマウントしているフォルダだと、chown 1000:1000 oradata/
しても適切なpermissionが
割り当たらずに死にました。(smbの仕組み的に、仕方ないのかな?よくわかってない)
黙ってVMのローカルディスクで作業してください。
完成したdocker imageのpush時
11gにかかわる話ではないですが、インストーラを探してきて・ビルドして使うのめんどくさいですよね?
そんな時、docker hubなどのリポジトリにストックしておくのが一般的かと思いますが、
完成したイメージを自分のリポジトリなどにpushしようとしてもエラーになります。
docker push oracle/database:11.2.0.2-xe # これはエラーになるコマンド
単にイメージ名:tagで構成されているイメージの oracle
の部分がdocker hubのユーザ名と
一致していないので、oracle/
には権限がない的なエラーだったかと思いますが、
適切にtagを設定してあげれば問題ありません
docker tag oracle/database:11.2.0.2-xe {自分のdocker hubのユーザ名}/oracle-database:11.2.0.2-xe # わかりやすい名前に変更する
docker push {自分のdocker hubのユーザ名}/oracle-database:11.2.0.2-xe
としてあれば、docker login済みであればpush可能でしょう。
SID
SIDはXE固定です。
12cなどでは、ORACLE_SID
環境変数に値をセットすることで任意のSIDを指定できますが、
XE固定のようです。(どこかで見た記事では、指定すると落ちると書いてあったような。。。)
docker-compose
参考にdocker-composeを書き残しておきます。
version: '3'
services:
db:
image: oracle/database:11.2.0.2-xe # ビルドしたイメージ名
container_name: oracle11g # docker psしたとき、docker execするときに使用する一意名を明示的に指定する
shm_size: 1g # /dev/shmに割り当てる容量を指定する. 1g以上指定しないと起動しない
ports:
- 1521:1521 # DB接続先ポート
- 8080:8080 # 何のためにあるのかわからないポート
volumes:
- ./oradata:/u01/app/oracle/oradata # 永続化したいデータ
environment:
ORACLE_BASE: /u01/app/oracle # なくても動くと思う
ORACLE_PWD: oracle # sys/systemのパスワード
TZ: Asia/Tokyo # TZ指定。効いてるのかは確認してない
他にも何かあれば更新していきます。