Oracle Databaseの公式イメージ（11g）を使用してはまったことまとめ

環境構築にDockerを使用して、ハマったポイントがあるため書き残しておきます。

## 前書き

dockerイメージについては、公式で公開されている[リポジトリ](https://github.com/oracle/docker-images)の情報をもとに作成しています。
インストーラの入手、ビルドについては公式リポジトリを参照すれば可能なはずです。
qiitaで記事にしている方もいらっしゃるようです
[@moriwakiii 様](https://qiita.com/moriwakiii/items/e885407dc1dc018d4950)

この記事にたどり着いた皆様なら、すでにここまではなんとなく終わっているんじゃないかと。。。

## 永続化ボリュームの場所

永続化ボリュームの場所は、`/u01/app/oracle/oradata`です

12cの場合：/opt/oracle/oradata
19cの場合：/opt/oracle/product/19c

のようです・・・~~コロコロ変えるなよ〇すぞ~~

## 永続化ボリュームのpermission

`docker run`するときや、`docker-compose up`するときなんかに永続化ボリュームとして
ローカルストレージをマウントすると思いますが、

```bash
docker run -it -d -p 1521:1521 -v ./oradata:/u01/app/oracle/oradata oracle/database:11.2.0.2-xe
```

その際以下のようなログが出て初期化に失敗している場合があります。

```bash
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`するまえに、

```bash
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しようとしてもエラーになります。

```bash
docker push oracle/database:11.2.0.2-xe # これはエラーになるコマンド
```

単にイメージ名:tagで構成されているイメージの `oracle`の部分がdocker hubのユーザ名と
一致していないので、`oracle/`には権限がない的なエラーだったかと思いますが、
適切にtagを設定してあげれば問題ありません

```bash
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を書き残しておきます。

```yml
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指定。効いてるのかは確認してない
```

他にも何かあれば更新していきます。