我正在使用 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