Docker容器时间和时区(不会反映变化)

Docker容器何时获取他们的时间信息? 我从基本的ubuntu创build了一些容器:可信的图像,当我运行它并请求'date'时,我得到UTC时间。

有一段时间我通过在Dockerfile中执行以下操作来解决这个问题:

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

但是,由于某种原因,停止工作。 在网上search我看到了下面的提示:

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

这两种方法虽然正确地设置了时区

 $ cat /etc/timezone America/Los_Angeles $ date Tue Apr 14 23:46:51 UTC 2015 

任何人都知道什么给?

    这里的秘诀在于, dpkg-reconfigure tzdata简单地将/etc/localtime创build为/usr/share/zoneinfo的文件的副本,硬链接或符号链接(首选符号链接)。 所以完全可以从Dockerfile中完成。 考虑:

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

    作为奖励,TZ也将在容器中正确设置。

    这也是分发不可知论的,所以它几乎可以与任何Linux一起工作。

    在映像中挂载/etc/localtime ,所以它与host -v同步host -v是最stream行的一个。

    但请参阅问题12084 :

    它是不正确的,因为它不工作时,软件需要而不是文件/etc/timezone设置。
    这样你使用的叶子作为默认值etc/UTC

    我已经确定,实际上没有万无一失的优雅的方式来设置docker集装箱内的时区。
    所以终于解决了这个解决scheme:

    应用程序dockerfile:

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

    应用程序入口点脚本:

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

    数据量/config dockerfile,本地化到特定的国家或地区:

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

    …因为涉及3个单独的文件,所以不是很优雅,并且在每个运行时容器启动时重新创build/etc/localtime 。 这是相当浪费的。

    但是,它确实正常工作,并成功地实现了基本应用程序映像和每个国家/地区本地化configuration之间的分离。
    在3行代码中。

    通常在Docker容器中设置环境variables就足够了,如下所示:

     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" 

    现在容器的时间和你的主机一样

    如果你使用的是基于ubuntu docker镜像:

     # Change the docker default timezone from UTC to SGT echo "Asia/Singapore" > /etc/timezone dpkg-reconfigure tzdata date 

    在Ubuntu 16.04的图像有bug。 解决scheme是

      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 

    感谢VonC的信息和问题的链接。 这似乎是这样一个令人费解的混乱,所以我做了一些testing,我自己的想法如何解决这个问题,它似乎很好。

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

    (按照提示select我的时区)

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

    然后我更新了我的Docker文件来反映这个:

     FROM chocko/ubuntu:local 

    一定有什么问题,因为它太容易被忽视…或者这是可以接受的吗?