きり丸の技術日記

技術・エンジニアのイベント・資格等はこちらにまとめる予定です

Oracle19cのイメージをローカルでDockerビルドする

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版

失敗の概要

  • 環境変数no_proxyアスタリスクを使用、また半角スペースを空けて複数設定を行っていた。
  • プロキシサーバを経由していた
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

イメージのサイズ

超重いです。

ちなみに公式でイメージを提供している

Docker Hubに登録されているイメージは、Oracleのサポートに登録していないと使用できないようですが、Oracle Container RegistryにOracleDatabaseのイメージが登録されていました。

2021年01月13日現在、Enterprise Editionの12cの軽量版1GBが提供されています。

ただ、私はダウンロードできず…。Oracleのライセンスに同意しているはずなのに。

人によってはダウンロードできるようですので、もしこちらでダウンロードできるのであれば自分でビルドする必要はありません。

container-registry.oracle.com

終わりに

ローカルで起動するようにしたものの、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

f:id:nainaistar:20201228233250p:plain