0
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Oracle Database の Docker で タイムゾーンを変更する

Posted at

概要

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

良く判らないエラーが発生しました。。。
ググってみると、同様の事象を対応している記事を発見しました。

Logging in as root on Oracle Database Docker image

記事のよると、--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 を変更する方が簡単ですので、そちらを実践される方が良いかと思います。

  1. イメージの元となっている Dockerfile に WORKDIR /home/oracle が指定されていることに起因しているようです。(https://github.com/oracle/docker-images/blob/master/OracleDatabase/SingleInstance/dockerfiles/12.2.0.1/Dockerfile#L105)

0
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?