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
Ollie
#3
通常は、次のようにdockerコンテナに環境変数を設定すれば十分です:
docker run -e TZ=Europe/Amsterdam debian:jessie date
もちろん、これはでも動作します docker-compose
.
Harley
#4
ローカルファイル(/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行で。
Skylar
#6
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
Gene_H
#9
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
見落とされるのは簡単すぎると思われるので、これには何か問題がなければなりません。.. または、これは許容可能ですか?