码头货柜时间及时区(不会反映更改)

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。

注意:如果您使用的是基于高山的图像,您必须安装 tzdata 首先。 (请参阅此问题 这里)

看起来像这样:

RUN apk add --no-cache tzdataENV TZ America/Los_Angeles

通常在docker容器中设置一个环境变量就足够了,就像这样:

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

当然,这也适用于 docker-compose.

您可以在docker容器中添加本地文件(/etc/timezone和/etc/localtime)作为卷。

更新您的 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行代码中。

在ubuntu16.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

在这里添加我的两分钱,因为我已经尝试了其中的几个,但没有一个工作在基于高山的图像。

然而,这做了伎俩:

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):

码头文件

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

使用Fedora容器(可能也适用于ubuntu):

我发现的最简单的解决方案是在docker-compose中使用以下内容。yml

environment:   TZ: "${TZ:-America/Los_Angeles}"

然后在你的。env文件(docker-compose自动读取的文件)

TZ=America/Los_Angeles

这可以让你把docker-compose。yml在版本控制下使用自定义.git可以忽略的env文件。

您将获得容器的默认值,并获得自定义,两全其美。

对于Fedora没有其他的改变是必要的,它只是工作!

如果您使用的是基于 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

这肯定有什么问题,因为它似乎太容易被忽视。.. 或者这是可以接受的?