我使用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
答案 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