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

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/timezone
America/Los_Angeles
$ date
Tue Apr 14 23:46:51 UTC 2015

有谁知道发生了什么事吗?

答案1

这里的秘诀是dpkg-reconfigure tzdata简单地创建/etc/localtime一个副本、硬链接或符号链接(首选符号链接)到 中的文件/usr/share/zoneinfo。因此,完全可以从 Dockerfile 中执行此操作。考虑:

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

另外,TZ 也将在容器中正确设置。

这也是与发行版无关的,因此它几乎可以与任何 Linux 兼容。

注意:如果你使用基于 Alpine 的图像,则必须先安装tzdata。(请参阅此问题这里

看起来像这样:

RUN apk add --no-cache tzdata
ENV TZ America/Los_Angeles

答案2

通常在 docker 容器中设置一个环境变量就足够了,如下所示:

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

当然这也适用于docker-compose

答案3

您可以将本地文件(/etc/timezone 和 /etc/localtime)作为卷添加到 docker-container 中。

docker-compose.yml使用以下几行更新您的。

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

现在容器的时间与主机上的时间相同

答案4

在 ubuntu 16.04 镜像中有一个 bug。解决方案是

    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

相关内容