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

mek*_*oke 20 timezone docker devops

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

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

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

echo "Africa/Lusaka" > /etc/timezone
Run Code Online (Sandbox Code Playgroud)

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

rug*_*312 70

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

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

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

  • 如果你想在运行时执行此操作(将其添加到此处只是为了完整性) `docker run -it --name=my-ubuntu --rm -v /etc/timezone:/etc/timezone:ro -v /etc /本地时间:/etc/本地时间:ro my-ubuntu:1` (2认同)

Adi*_*iii 28

您可以在运行阶段按照@LinPy 的建议进行覆盖,但是如果您想在 Dockerfile 中进行设置,您可以使用 ENV 进行设置,因为 tzdata 已经存在于您的基础映像中。

FROM postgres:10
ENV TZ="Africa/Lusaka"
RUN date
Run Code Online (Sandbox Code Playgroud)

建造

docker build -t dbtest .

docker run -it dbtest -c "date"

现在您可以通过运行在数据库端进行验证

show timezone;

您将Central Africa Time在容器和 Postgres 中看到

在 alpine 基础映像中,环境变量将不起作用。你需要运行

 RUN ls /usr/share/zoneinfo && \
cp /usr/share/zoneinfo/Europe/Brussels /etc/localtime && \
echo "Africa/Lusaka" >  /etc/timezone && \
Run Code Online (Sandbox Code Playgroud)

  • 请注意,必须安装“tzdata”包。或者 `/usr/share/zoneinfo` 可能根本不存在。我的 Ubuntu docker 容器就是这种情况。我必须先安装“tzdata”。 (3认同)

Lin*_*nPy 13

最好的方法是ENV在你的运行阶段使用

-e TZ=Africa/Lusaka
Run Code Online (Sandbox Code Playgroud)

并确保包裹tzdata存在于Container


小智 5

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

env:
  - name: TZ
    value: "Europe/London"
Run Code Online (Sandbox Code Playgroud)

(kubernetes部署yaml)


mos*_*ini 5

只需将 /etc/localtime 更改为 /usr/share/zoneinfo 目录中的时区。

按着这些次序:

首先登录到容器的 bash:

docker exec -u 0 -it mycontainer bash
Run Code Online (Sandbox Code Playgroud)

然后删除符号链接文件(/etc/localtime):

sudo rm -rf /etc/localtime
Run Code Online (Sandbox Code Playgroud)

确定要配置的时区并为其创建符号链接:

例如,我想设置亚洲/德黑兰时区:

ln -s /usr/share/zoneinfo/Asia/Tehran /etc/localtime
Run Code Online (Sandbox Code Playgroud)

现在通过以下方式验证:

date
Run Code Online (Sandbox Code Playgroud)

输出将是您的时区:

Sat Jan 30 14:22:17 +0330 2021
Run Code Online (Sandbox Code Playgroud)