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

问题描述 投票:0回答:10

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

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

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

echo "Africa/Lusaka" > /etc/timezone

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

docker timezone devops
10个回答
80
投票

您可以在运行阶段按照 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 && \

70
投票

有几种方法可以做到。

  1. 可以直接在docker compose文件中将时区声明为环境变量
   environment:
      - TZ=Asia/Singapore
      - DEBIAN_FRONTEND=noninteractive
  1. 您可以在 docker compose 文件中映射容器的时区和本地时间文件以使用主机的时区和本地时间
volumes:
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro

我个人更喜欢使用第二种方法,这样我的所有容器都将具有与我的主机相同的时间配置


47
投票

只需将 /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

27
投票

最好的方法是在你的跑步阶段使用

ENV

-e TZ=Africa/Lusaka

并确保包裹

tzdata
存在于
Container


5
投票

更简单的方法是将环境变量添加到您的部署中:

env:
  - name: TZ
    value: "Europe/London"

(kubernetes部署yaml)


4
投票

如果您正确设置了

TZ
env,但仍然得到错误的时间,请确保安装了
tzdata
系统依赖项。


1
投票

这个问题是关于 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


1
投票

对于任何使用 --env-file 的人。添加

# .env
TZ=Asia/Shanghai

到.env文件,它会得到你想要的时区。


1
投票

对于法国,对于docker容器,在docker-compose.yml中,我测试成功了:

在卷部分我添加了这两个条目:

volumes:
- /etc/timezone:/etc/timezone:fr
- /etc/localtime:/etc/localtime:fr

0
投票

使用

ls /usr/share/zoneinfo/

显示所有区域

© www.soinside.com 2019 - 2024. All rights reserved.