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
一定有什么问题,因为它太容易被忽视…或者这是可以接受的吗?