概要
Oracle Database の Docker にてタイムゾーンを変更するための手順になります。
Oracle Database の Docker導入の手順に関しては、下記記事が非常に参考になりました。
DockerでOracle Databaseを使う
詳細な手順については、公式リポジトリを参考にいただくと良いかと思います。
https://github.com/oracle/docker-images/blob/master/OracleDatabase/SingleInstance/README.md
環境
- Docker for Windows
- Windows10
- Oracle Database 12c
結論
docker-compose.yaml に環境変数TZを設定すればOKです。
version: '2'
services:
db:
image: oracle/database:12.1.0.2-se2
container_name: oracle
ports:
- 1521:1521
- 5500:5500
volumes:
- ./oradata:/opt/oracle/oradata
environment:
- ORACLE_PWD=Oracle01
- ORACLE_PDB=pdb01
- TZ=Asia/Tokyo ★★★ これ ★★★
右往左往した記録
(※) 以下、調査した過程を備忘録として残します。完全に蛇足なので、興味のある方だけご覧ください。
Oracle Database の Docker を利用している際、 SYSDATE
関数を実行した結果が UTC になっていることに気付きました。
docker exec でコンテナに接続し、dateコマンドを叩いてみると案の定、 UTC になっていました。
$ date
Sat Feb 1 15:07:28 UTC 2020
Linuxサーバのタイムゾーンを変更するには、timedatectlを使う方法 (RHEL7系 / CentOS7系) やタイムゾーンの設定ファイル (/usr/share/zoneinfo)をコピーする方法があります。
OSの情報を確認したところ、RHEL7.7となっていました。
$ cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.7 (Maipo)
試しにコンテナ内で timedatectl を叩いてみると、エラーが発生します。
$ timedatectl
Failed to create bus connection: No such file or directory
調査してみたところコンテナの実行権限に起因する可能性があり、特権モード (privileged) を設定したり、ケーパビリティの設定を変更する事で解消する可能性があるという情報を見つけたのですが、解決することが出来ませんでした。
(※) 情報をご存じの方がいらっしゃれば、教えていただけると助かります。
よって、タイムゾーンの設定ファイルのコピーによって対応することにしました。
# シンボリックリンクを設定する方法もあります
# ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
$ cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
cp: cannot create regular file '/etc/localtime': Permission denied
パーミッション不足で怒られたため、rootユーザでコンテナにログインします。
PS > docker exec -it --user root {コンテナ名} /bin/bash
OCI runtime exec failed: exec failed: container_linux.go:346: starting container process caused "chdir to cwd (\"/home/oracle\") set in config.json failed: permission denied": unknown
良く判らないエラーが発生しました。。。
ググってみると、同様の事象を対応している記事を発見しました。
記事のよると、--workdir
オプションを使ってDockerfileのWORKDIR
の設定を上書きするといいよ1 とのことなので、早速試してみます。
PS > docker exec -it --user root --workdir / {コンテナ名} /bin/bash
bash-4.2# cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
bash-4.2# date
Sun Feb 2 21:55:24 JST 2020
上手くいきました。
ただ、今回の場合は 環境変数TZ を変更する方が簡単ですので、そちらを実践される方が良いかと思います。
-
イメージの元となっている Dockerfile に
WORKDIR /home/oracle
が指定されていることに起因しているようです。(https://github.com/oracle/docker-images/blob/master/OracleDatabase/SingleInstance/dockerfiles/12.2.0.1/Dockerfile#L105) ↩