Dockerコンテナの時間とタイムゾーン(変更は反映されません)

Dockerコンテナはどこで時間情報を取得しますか? 私は基本的なubuntu:trustyイメージからいくつかのコンテナを作成しました、そして私はそれを実行して'日付'を要求すると、私はUTC時間を取得します。

しばらくの間、私は私のDockerfileで次のようにしてこれを回避しました:

RUN sudo echo "America/Los_Angeles" > /etc/timezone

しかし、何らかの理由で動作を停止しました。 オンラインで検索すると、私は以下の提案を見ました:

docker run -v /etc/timezone:/etc/timezone [image-name]

これらの方法は両方とも正しくタイムゾーンを設定します!

$ cat /etc/timezoneAmerica/Los_Angeles$ dateTue Apr 14 23:46:51 UTC 2015

誰が何を与えるか知っていますか?

ここでの秘密はそれです dpkg-reconfigure tzdata 単純に作成します /etc/localtime コピーとして、ファイルへのハードリンクまたはシンボリックリンク(シンボリックリンクが優先されます) /usr/share/zoneinfo. したがって、Dockerfileからこれを完全に行うことは可能です。 考えてみましょう:

ENV TZ=America/Los_AngelesRUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

また、ボーナスとして、tzはコンテナにも正しく設定されます。

これは配布にも依存しないため、ほとんどすべてのLinuxで動作します。

注:alpineベースのイメージを使用している場合は、インストールする必要があります。 tzdata 最初に。 (この問題を参照してください ここでは、)

このようになります:

RUN apk add --no-cache tzdataENV TZ America/Los_Angeles

通常は、次のようにdockerコンテナに環境変数を設定すれば十分です:

docker run -e TZ=Europe/Amsterdam debian:jessie date

もちろん、これはでも動作します docker-compose.

ローカルファイル(/etc/timezoneおよび/etc/localtime)をdocker-containerのボリュームとして追加できます。

あなたの更新 docker-compose.yml 次の行で。

volumes:    - "/etc/timezone:/etc/timezone:ro"    - "/etc/localtime:/etc/localtime:ro"

これでコンテナ時間はホストと同じになります

取り付け /etc/localtime イメージでは、それはと同期しています host -v 最も人気のあるものです。

しかし、参照してください 第12084号:

ソフトウェアが代わりにファイルを必要とするとき、それは動作しませんので、それは正しくありません /etc/timezone 設定される。
あなたが使用しているそうすれば、デフォルト値としてそれを残します etc/UTC.

私は実際にdockerコンテナの中にタイムゾーンを設定するための確実なエレガントな方法はないと判断しました。
だから、最終的にこの解決策に定住している:

アプリdockerfile:

# Relocate the timezone fileRUN mkdir -p /config/etc && mv /etc/timezone /config/etc/ && ln -s /config/etc/timezone /etc/

アプリエントリポイントスクリプト:

# Set timezone as specified in /config/etc/timezonedpkg-reconfigure -f noninteractive tzdata

データ量 /config 特定の国または地域にローカライズされたdockerfile:

# Set the time zoneRUN echo "Europe/London" > /config/etc/timezone

... 3つの別々のファイルを含んでいて、再作成するのでエレガントではありません /etc/localtime すべてのランタイムコンテナの起動時に。 それはむしろ無駄です。

しかし、それは正常に動作し、ベースアプリイメージと国ごとのローカライズされた構成との間の分離を正常に達成します。
コードの3行で。

Ubuntu16.04の画像にはバグがあります。 解決策は

    ENV TZ 'Europe/Tallinn'    RUN echo $TZ > /etc/timezone && \    apt-get update && apt-get install -y tzdata && \    rm /etc/localtime && \    ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && \    dpkg-reconfigure -f noninteractive tzdata && \    apt-get clean

私はこれらのいくつかを試してみましたが、アルパインベースの画像には何も働いていなかったので、ここに私の二セントを追加します。

しかし、これはトリックをしました:

ENV TZ=America/TorontoRUN apk updateRUN apk upgradeRUN apk add ca-certificates && update-ca-certificatesRUN apk add --update tzdataRUN rm -rf /var/cache/apk/*

[ソース]

Alpineの基本イメージ(ノードの使用例:10.16.0-alpine)では、次のように定義されています。:

Dockerfile

FROM node:10.16.0-alpineENV TZ=America/Los_AngelesRUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezoneWORKDIR /appCOPY package.json package-lock.json ./RUN npm i --productionCOPY . .CMD node index.js

Fedoraコンテナを使用する(ubuntuでも動作する可能性が高い):

私が見つけた最も簡単な解決策は、docker-composeで以下を使用することでした。yml

environment:   TZ: "${TZ:-America/Los_Angeles}"

その後、あなたの中で。envファイル(docker-composeが自動的に読み込む)

TZ=America/Los_Angeles

これにより、docker-composeを置くことができます。バージョン管理の下でymlとカスタマイズを使用します。gitで無視できるenvファイル。

あなたはコンテナのデフォルト値を取得し、あなたはカスタマイズ、両方の世界の最高を取得します。

Fedoraのために他の変更は必要ありませんでした、それだけで動作します!

に基づいてdockerイメージを使用している場合 ubuntu :

# Change the docker default timezone from UTC to SGTecho "Asia/Singapore" > /etc/timezonedpkg-reconfigure tzdatadate

情報と問題へのリンクのためのVonCに感謝します。 これはそのような複雑な混乱のように思えるので、私はこれを解決する方法についての私自身の考えでいくつかのテストをしました、そしてそれは

>docker run -it ubuntu:trusty /bin/bash#dpkg-reconfigure tzdata

(私のタイムゾーンを選択するためのプロンプトに従ってください)

>docker commit [container-id] chocko/ubuntu:local

それから私はこれを反映するために私のDockerfilesを更新しました:

FROM chocko/ubuntu:local

見落とされるのは簡単すぎると思われるので、これには何か問題がなければなりません。.. または、これは許容可能ですか?