【问题标题】:How do I change timezone in a docker container?如何更改 docker 容器中的时区?
【发布时间】:2026-01-31 15:50:01
【问题描述】:

我正在为我从 docker-hub 提取的开发堆栈运行 docker 容器,该映像是为与我的应用程序应该部署的位置不同的时区创建的。

如何在 docker 容器中更改时区?

我尝试通过运行更改容器内的时区配置

echo "Africa/Lusaka" > /etc/timezone

并重新启动容器,但我仍然得到相同的时区。

【问题讨论】:

  • 嗨 @LinPy 我用过 postgresql:10

标签: docker timezone devops


【解决方案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 && \

【讨论】:

【解决方案2】:

有几种方法可以做到这一点。

  1. 可以在docker compose文件中直接将时区声明为环境变量
   environment:
      - TZ=Asia/Singapore
      - DEBIAN_FRONTEND=noninteractive
  1. 您可以在 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 系统依赖项。

        【讨论】: