如何更改 docker 容器中的时区?
Posted
技术标签:
【中文标题】如何更改 docker 容器中的时区?【英文标题】:How do I change timezone in a docker container? 【发布时间】:2019-12-27 15:54:11 【问题描述】:我正在为我从 docker-hub 提取的开发堆栈运行 docker 容器,该映像是为与我的应用程序应该部署的位置不同的时区创建的。
如何在 docker 容器中更改时区?
我尝试通过运行更改容器内的时区配置
echo "Africa/Lusaka" > /etc/timezone
并重新启动容器,但我仍然得到相同的时区。
【问题讨论】:
嗨 @LinPy 我用过 postgresql:10 【参考方案1】:您可以在运行阶段按照@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 && \
【讨论】:
请注意tzdata
包必须安装。或者/usr/share/zoneinfo
甚至可能不存在。对我来说,Ubuntu docker 容器就是这种情况。我必须先安装tzdata
。
是的,同意@jdhao,但它已经存在于 alpine 的 Postgres 图像库中 github.com/docker-library/postgres/blob/…
要获取用于 TZ 的有效值列表,请参阅此站点:en.wikipedia.org/wiki/List_of_tz_database_time_zones【参考方案2】:
有几种方法可以做到这一点。
-
可以在docker compose文件中直接将时区声明为环境变量
environment: - TZ=Asia/Singapore - DEBIAN_FRONTEND=noninteractive
-
您可以在 docker compose 文件中映射容器的时区和本地时间文件以使用主机的时区
volumes: - /etc/timezone:/etc/timezone:ro - /etc/localtime:/etc/localtime:ro
我个人更喜欢使用第二种方法,这样我所有的容器都会和我的宿主机有相同的时间配置
【讨论】:
【参考方案3】:最好的方法是在你的运行阶段使用ENV
-e TZ=Africa/Lusaka
并确保 tzdata
包存在于 Container
中
【讨论】:
【参考方案4】:只需将 /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
【讨论】:
【参考方案5】:更简单的方法是在部署中添加一个 env var:
env:
- name: TZ
value: "Europe/London"
(kubernetes 部署 yaml)
【讨论】:
谢谢。这就是我需要的。效果很好。【参考方案6】:如果您正确设置了 TZ
env 并且仍然得到错误的时间,请确保已安装 tzdata
系统依赖项。
【讨论】:
以上是关于如何更改 docker 容器中的时区?的主要内容,如果未能解决你的问题,请参考以下文章