OracleのDatabaseで開発することになりました。サクっと環境構築したかったので、Dockerでローカル環境を構築しようとしましたが、Docker Hubにはイメージが提供されていません。ですので、自分でOracleDatabaseのイメージをビルドする必要があります。
今回の記事は、OracleのDatabaseをDockerビルドする方法を記載します。
なお、OracleのDatabaseをDocker化する手順は、すでにいくつかのサイトに存在します。私のローカルでうまくいかなかった点が多々あったので、自分のためにも作業メモを残します。
環境
- Mac
- Docker version 20.10.0, build 7287ab3
- 19.3 - Enterprise Edition (also includes Standard Edition 2) Linux x86-64 Zip版
失敗の概要
echo $no_proxy 10.*, 172.*, 192.168.*
ビルド手順
Dockerビルド用のリポジトリをクローンする
https://github.com/oracle/docker-images
ビルド用のインストーラをダウンロードする
インストーラのZipファイルをダウンロードしてください。
https://www.oracle.com/jp/database/technologies/oracle-database-software-downloads.html
インストーラを適切な位置に配置する
Dockerfileにインストーラのファイル名を指定しているので、変更しないでください。また、解凍は不要です。
cd docker-images/OracleDatabase/SingleInstance/dockerfiles/19.3.0 cp ~/Downloads/LINUX.X64_193000_db_home.zip .
buildDockerImage.shを一部書き換える(オリジナル)
プロキシの設定によっては、ファイルを一部書き換える必要があります。
変更対象ファイル。
docker-images/OracleDatabase/SingleInstance/dockerfiles/buildDockerImage.sh
私のローカルではno_proxy
に次の設定をしていましたが、アスタリスク(*)と半角スペースで除外プロキシを区切っていたので、実行時に失敗してしまいました。
echo $no_proxy 10.*, 172.*, 192.168.*
変更はダブルクオートでアスタリスクを許容できるようにし、半角スペースを削除します。
# 変更前 PROXY_SETTINGS="$PROXY_SETTINGS --build-arg no_proxy=${no_proxy}" # 変更後 PROXY_SETTINGS="$PROXY_SETTINGS --build-arg no_proxy=\"$(echo $no_proxy | sed 's/ //g')\""
なお、修正しないとコマンドとして成立しなくなるため、次のエラーが発生します。
"docker build" requires exactly 1 argument. See 'docker build --help'. Usage: docker build [OPTIONS] PATH | URL | - Build an image from a Dockerfile ERROR: Oracle Database Docker Image was NOT successfully created. ERROR: Check the output and correct any reported problems with the docker build operation.
余談
この件に対してPull Requestを作ろうと思ったものの、Oracleのコントリビュートガイドが非常に面倒だったのでやめました。紙に署名を書いて、FAXで送らなきゃいけないなんて、なんて前時代的…。
この記事を読んでいて、Oracleのコントリビュートガイドに従う体力がある人、コントリビュートチャンスです。
秘密鍵の認証局を無視する設定を加える(オリジナル)
※ 正しいやり方ではないと認識しています。
ビルドしようとしているマシンが、認証局を通じて通信している場合は引っかかると思います。マシンに認証局の秘密鍵を登録していても、Dockerのイメージには認証局は入っていません。ですので、認証局の秘密鍵をDockerに登録することが一番正しいやり方だと思います。
ですが、今回は開発用のDB用ですので、一番簡単な方法を選びました。
変更対象ファイル。
docker-images/OracleDatabase/SingleInstance/dockerfiles/19.3.0/setupLinuxEnv.sh
Dockerのsslverify=false
をDockerのyum.confに設定してあげれば、認証局がなくても疎通ができます。
echo "sslverify=false" >> /etc/yum.conf && \
設定しない場合は次のエラーが発生します。
#8 3.664 Loaded plugins: ovl #8 4.722 https://yum.oracle.com/repo/OracleLinux/OL7/latest/x86_64/repodata/repomd.xml: [Errno 14] curl#60 - "Peer's Certificate issuer is not recognized." #8 4.722 Trying other mirror. #8 4.722 #8 4.722 #8 4.722 One of the configured repositories failed (Oracle Linux 7Server Latest (x86_64)), #8 4.722 and yum doesn't have enough cached data to continue. At this point the only #8 4.722 safe thing yum can do is fail. There are a few ways to work "fix" this: #8 4.722 #8 4.722 1. Contact the upstream for the repository and get them to fix the problem. #8 4.722 #8 4.722 2. Reconfigure the baseurl/etc. for the repository, to point to a working #8 4.722 upstream. This is most often useful if you are using a newer #8 4.722 distribution release than is supported by the repository (and the #8 4.722 packages for the previous distribution release still work). #8 4.722 #8 4.722 3. Run the command with the repository temporarily disabled #8 4.722 yum --disablerepo=ol7_latest ... #8 4.722 #8 4.722 4. Disable the repository permanently, so yum won't use it by default. Yum #8 4.722 will then just ignore the repository until you permanently enable it #8 4.722 again or use --enablerepo for temporary usage: #8 4.722 #8 4.722 yum-config-manager --disable ol7_latest #8 4.722 or #8 4.722 subscription-manager repos --disable=ol7_latest #8 4.722 #8 4.722 5. Configure the failing repository to be skipped, if it is unavailable. #8 4.722 Note that yum will try to contact the repo. when it runs most commands, #8 4.722 so will have to try and fail each time (and thus. yum will be be much #8 4.722 slower). If it is a very temporary problem though, this is often a nice #8 4.722 compromise: #8 4.722 #8 4.722 yum-config-manager --save --setopt=ol7_latest.skip_if_unavailable=true #8 4.722 #8 4.722 failure: repodata/repomd.xml from ol7_latest: [Errno 256] No more mirrors to try. #8 4.722 https://yum.oracle.com/repo/OracleLinux/OL7/latest/x86_64/repodata/repomd.xml: [Errno 14] curl#60 - "Peer's Certificate issuer is not recognized." ------ executor failed running [/bin/sh -c yum -y install oracle-database-preinstall-19c openssl]: exit code: 1
イメージをビルドする
オプション等の詳細は、GitHubのリポジトリを参照してください。
./buildDockerImage.sh -v 19.3.0 -s
以上で、Dockerのイメージをビルドできます。
ビルドしたイメージを使用する
docker-compose.ymlを準備する
こちらも、基本はGitHubのリポジトリでオプションを確認してください。
注意しなければいけないのが、restartオプションです。Dockerのイメージが7GBと非常に重いので、起動には20分程度かかります。
起動までの時間が長いので、Docker側がハングアップしたと判断してrestartをかけてしまい、延々と再起動して正常起動しなくなります。遅延時間を20分から開始、またはステータスがunhealthyの場合にのみrestartするオプションがあればよかったのですが、現時点ではなさそうなのでrestartを設定しないほうが良さそうです。
公式引用。
サーバが溢れかえるのを防ぐため、再起動の前に遅延時間が追加されます(遅延は100ミリ秒から開始し、直前の値の2倍になります)。つまり、デーモンは100ミリ秒待った後は、200ミリ秒、400、800、1600…と on-failure 上限に到達するか、あるいは、コンテナを docker stop で停止するか、 docker rm -f で強制削除するまで続けます。
version: '3.1' services: postgres: image: oracle/database:19.3.0-se2 ports: - "11521:1521" - "15500:5500" container_name: oracle environment: ORACLE_SID: ORCLCDB ORACLE_PDB: ORCLPDB1 ORACLE_PWD: pass ORACLE_CHARACTERSET: AL32UTF8 hostname: oracle # restart: no
イメージのサイズ
超重いです。
- インストーラの容量:2.8GB
- Dockerイメージの容量:7GB
ちなみに公式でイメージを提供している
Docker Hubに登録されているイメージは、Oracleのサポートに登録していないと使用できないようですが、Oracle Container RegistryにOracleDatabaseのイメージが登録されていました。
2021年01月13日現在、Enterprise Editionの12cの軽量版1GBが提供されています。
ただ、私はダウンロードできず…。Oracleのライセンスに同意しているはずなのに。
人によってはダウンロードできるようですので、もしこちらでダウンロードできるのであれば自分でビルドする必要はありません。
終わりに
ローカルで起動するようにしたものの、SELECTしたりすると重いので開発で使うかどうかは悩んでいます。
最低限の動作確認はできると思いますが…。
重いイメージのDockerで開発する知見がないので、今後いろいろ試していきたいです。
この記事がお役に立ちましたら、各種SNSでのシェアや、今後も情報発信しますのでフォローよろしくお願いします。
参考資料
gorilla0513:DockerでOracle Databaseを使う
https://qiita.com/gorilla0513/items/f22e8cce4e08da031abe
Docker公式:証明書をリポジトリのクライアント認証に使用 https://docs.docker.jp/engine/security/certificates.html
Docker公式:再起動ポリシー(--restart) https://docs.docker.jp/engine/reference/run.html?highlight=run#restart