如何更改 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 容器中的时区?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 docker 上更改 postgreSQL 9.5 的时区?

[转帖]Docker中的时区问题处理

docker学习16-Docker 容器设置时区

centos中修改docker容器的时区

如何修改已有docker容器的dns

如何在docker中分配时区