我正在为我的开发堆栈运行 docker 容器,该容器是从 docker-hub 中提取的,该映像是为与我的应用程序应该部署的时区不同的时区创建的。
如何更改 docker 容器中的时区?
我尝试通过运行来更改容器内的时区配置
echo "Africa/Lusaka" > /etc/timezone
并重新启动容器,但我仍然得到相同的时区。
您可以在运行阶段按照 LinPy 的建议进行覆盖,但如果您想在 Dockerfile 中设置它,您可以使用 ENV,因为 tzdata 已经存在于您的基础镜像中。
FROM postgres:10
ENV TZ="Africa/Lusaka"
RUN date
构建
docker build -t dbtest .
奔跑
docker run -it dbtest -c "date"
现在您可以通过运行在数据库端进行验证
show timezone;
您将在容器和 Postgres 中看到
Central Africa Time
。
在 alpine 基础镜像中,环境变量将不起作用。你需要跑步
RUN ls /usr/share/zoneinfo && \
cp /usr/share/zoneinfo/Europe/Brussels /etc/localtime && \
echo "Africa/Lusaka" > /etc/timezone && \
有几种方法可以做到。
environment: - TZ=Asia/Singapore - DEBIAN_FRONTEND=noninteractive
volumes: - /etc/timezone:/etc/timezone:ro - /etc/localtime:/etc/localtime:ro
我个人更喜欢使用第二种方法,这样我的所有容器都将具有与我的主机相同的时间配置
只需将 /etc/localtime 更改为 /usr/share/zoneinfo 目录中的时区即可。
请按照以下步骤操作:
首先登录容器的 bash:
docker exec -u 0 -it mycontainer bash
然后删除符号链接文件(/etc/localtime):
sudo rm -rf /etc/localtime
确定您要配置的时区并为其创建符号链接:
例如,我想设置亚洲/德黑兰时区:
ln -s /usr/share/zoneinfo/Asia/Tehran /etc/localtime
现在通过以下方式验证:
date
输出将是您的时区:
Sat Jan 30 14:22:17 +0330 2021
最好的方法是在你的跑步阶段使用
ENV
-e TZ=Africa/Lusaka
并确保包裹
tzdata
存在于Container
中
更简单的方法是将环境变量添加到您的部署中:
env:
- name: TZ
value: "Europe/London"
(kubernetes部署yaml)
如果您正确设置了
TZ
env,但仍然得到错误的时间,请确保安装了 tzdata
系统依赖项。
这个问题是关于 postgres 基础的,我的问题是关于 Alpine 基础的,但是根据 Alpine Wiki,我能收集到的最佳实践意味着我的 Dockerfile 如下所示:
FROM alpine:3.14
RUN apk add --no-cache alpine-conf && \
setup-timezone -z Europe/London
https://wiki.alpinelinux.org/wiki/Alpine_setup_scripts#setup-timezone
对于任何使用 --env-file 的人。添加
# .env
TZ=Asia/Shanghai
到.env文件,它会得到你想要的时区。
对于法国,对于docker容器,在docker-compose.yml中,我测试成功了:
在卷部分我添加了这两个条目:
volumes:
- /etc/timezone:/etc/timezone:fr
- /etc/localtime:/etc/localtime:fr
使用
ls /usr/share/zoneinfo/
显示所有区域