我正在使用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
我也遇到过时区问题,对我来说这就是诀窍:
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
-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