docker-compose:容器时区

时间:2017-11-26 16:21:00

标签: docker timezone docker-compose

我使用Docker Compose在我的开发环境中运行我的堆栈,但我在容器中的时区问题比我自己的时区落后一小时,打破关键任务并开发开发非常困难。

我认为这是一个常见的问题,所以我进行了广泛的搜索,但我发现的唯一两种解决方案都不起作用(不工作:没有效果)。

我尝试了两件事:

尝试1 - 从主机中识别卷
通过尝试将/etc/timezone/etc/localtime挂载为ro - 卷,我希望容器与主机具有相同的时区。没效果。

尝试2 - 在command 中设置变量 我没有让Docker Compose使用ENTRYPOINT中指定的Dockerfile,而是在command文件中设置了docker-compose.yml,因此:

environment:
    - APPLICATION_ENV=dev-docker
    - TZ=Europe/Stockholm
build: ../../core/document
command: >
  sh -c "ln -snf /usr/share/zoneinfo/$TZ /etc/localtime &&
  echo $TZ > /etc/timezone &&
  exec /go/bin/documents"

再一次,根本没有效果。

在Docker容器中没有正式的时区设置方法吗?我认为对于比我更多的用户来说这应该是一个关键问题。

感谢。

修改:来自dockerfile - 项目的core/documents,视要求而定。

# This file is intended for use with the GitLab CI tool where the binary has already been built.
FROM golang:1.9.2

# The binary is built and downloaded to the current directory by GitLab CI.
COPY ./documents /go/bin

# Run the program.
ENTRYPOINT /go/bin/documents

2 个答案:

答案 0 :(得分:4)

我也遇到过时区问题,对我来说这就是诀窍:

environment:
  - TZ=Europe/Stockholm

答案 1 :(得分:0)

我看到我从来没有正确回答过这个问题。我确实找到了解决方案。

TL; DR:
Alpine仅检查/usr/share/zoneinfo/Europe/Stockholm文件,而不检查/etc/localtime文件。

更长的答案
基本上,缺少的步骤是Alpine不检查/etc/localtime路径-它仅检查/usr/share/zoneinfo/Europe/Stockholm路径(更改为您的时区)。

就我而言,我决定采用一种可以说是非传统的解决方案。我想:

  • 仅复制我真正想要的时区,因为tzdata包的大小是容器其余部分的两倍;基本图片和二进制图片都可以
  • 运行正确的apk tel tzdata命令,不要以某种奇怪的rm方式清理自己。
  • 不要使tzdata-包和其他文件杂乱无章,也不要手动将内容写入文件中(符号链接除外)

因此,我决定安装tzdata,将我想要的时区复制到/etc/localtime,然后为Alpine创建一个符号链接以仍然读取文件。

我的Dockerfile中有以下内容:

RUN \
    apk --update add curl bash nano tzdata && \
    cp /usr/share/zoneinfo/Europe/Stockholm /etc/localtime && \
    echo "Europe/Stockholm" > /etc/timezone && \
    apk del tzdata && \
    rm -r /var/cache/apk/* && \
    mkdir -p /usr/share/zoneinfo/Europe && \
    ln -s /etc/localtime /usr/share/zoneinfo/Europe/Stockholm