Ollie
#1
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
任何人都知道什么给?
Ray
#2
这里的秘密是 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"
现在容器时间与主机上的时间相同
Eli_D
#5
安装/安装 /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
Quinn
#7
在这里添加我的两分钱,因为我已经尝试了其中的几个,但没有一个工作在基于高山的图像。
然而,这做了伎俩:
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
这肯定有什么问题,因为它似乎太容易被忽视。.. 或者这是可以接受的?