docker-compose:容器时区



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

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

我尝试了两件事:

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

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

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 容器中设置时区的官方方法吗?我觉得这对比我更多的用户来说应该是一个关键问题。

谢谢。

编辑:根据请求,core/documents项目中的dockerfile

# 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

我也遇到了时区问题,对我来说,这成了诀窍:

environment:
- TZ=Europe/Stockholm

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

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

相关内容

  • 没有找到相关文章

最新更新