Docker 容器从哪里获取时间信息?我从基本的 ubuntu:trusty 映像创建了一些容器,当我运行它并请求“日期”时,我得到了 UTC 时间。
有一段时间我通过在我的 Dockerfile 中执行以下操作来解决这个问题:
RUN sudo echo "America/Los_Angeles" > /etc/timezone
但是,由于某种原因停止工作。在网上搜索我看到以下建议:
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
一个副本、硬链接或符号链接(首选符号链接)到/usr/share/zoneinfo
. 因此,可以完全从您的 Dockerfile 执行此操作。考虑:作为奖励,TZ 也将在容器中正确设置。
这也与发行版无关,因此它几乎适用于任何 Linux。
注意:如果您使用的是基于 alpine 的映像,则必须安装第
tzdata
一个。(在这里看到这个问题)看起来像这样:
通常在 docker 容器中设置一个环境变量就足够了,如下所示:
当然,这也适用于
docker-compose
.您可以将本地文件(/etc/timezone 和 /etc/localtime)添加为 docker-container 中的卷。
docker-compose.yml
使用以下几行更新您的。现在容器时间与您主机上的时间相同
安装
/etc/localtime
在图像中,因此它是host -v
最流行的一种。但请参阅问题 12084:
在 ubuntu 16.04 映像中存在错误。解决方案是
在这里加上我的两分钱,因为我已经尝试了其中的几个,但没有一个适用于基于 alpine 的图像。
然而,这成功了:
[来源]
如果您使用基于以下内容的 docker 映像
ubuntu
:在 alpine 基本图像中(示例使用节点:10.16.0-alpine):
使用 Fedora 容器(也可能与 ubuntu 一起使用):
我发现的最简单的解决方案是在 docker-compose.yml 中使用以下内容
然后在您的 .env 文件中(docker-compose 自动读取)
这允许您将 docker-compose.yml 置于版本控制之下,并使用可被 git 忽略的自定义 .env 文件。
您获得容器的默认值并获得自定义,两全其美。
对于 Fedora,无需进行其他更改,它就可以工作!
感谢 VonC 提供的信息和问题链接。这似乎是一个令人费解的混乱,所以我对如何解决这个问题的想法进行了一些测试,它似乎工作得很好。
(按照提示选择我的时区)
然后我更新了我的 Dockerfiles 以反映这一点:
这一定有问题,因为它似乎太容易被忽视......或者这是可以接受的吗?