docker-compose:容器时区

问题描述 投票:1回答:2

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

我认为这将是一个常见的问题,所以我搜索的范围很广,但我找到的唯一两个解决方案都不起作用(不起作用:没有效果)。

我尝试了两件事:

尝试1 - 从主机中符号化卷 通过尝试将/etc/timezone/etc/localtime安装为ro-volumes,我希望容器与主机具有相同的时区。没有效果。

尝试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
docker timezone docker-compose
2个回答
4
投票

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

environment:
  - TZ=Europe/Stockholm

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-packages与其他文件混为一谈,也不要手动写东西(除了符号链接)

因此,我决定安装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
© www.soinside.com 2019 - 2024. All rights reserved.