原来Docker容器中设置时区这么简单
Docker 容器中设置时区
大家好, 我是老麦。 今天我们一起讨论一下容器时区的问题。
在 linux 中, 通过 /etc/timezone
这个文件设置。 可以通过如下命令 持久化 时区设置, 其中 Asia/Shanghai
是我们需要的时区。
cp -a /usr/share/zoneinfo/Asia/Shanghai /etc/timezone
容器中设置时区一直是独立于宿主机的。 可以通过挂载 /etc/timezone
的方式保持与宿主机时间一致。
docker run --rm -it -v /etc/timezone:/etc/timezone debian bash
这种方法只适合 本地的、简单的、临时的 容器。
容器有一个很重要的特点, 就是 一处编译, 处处运行。 另外, 容器运行环境本身应该是 独立/隔离 的, 即使是时区也不应该依赖于宿主机。
通过 TZ 环境变量
设置时区
在 Linux 中, 还可以通过 TZ
这个环境变量来设置时区。 但是这种设置并不能实现持久化, 只能在 当前进程和其子进程 中生效。
export TZ=Asia/Shanghai
这种方式在 Linux 系统中不合适, 但是在容器中却相当合适。 因为容器核心就是 单进程应用, 不会像 Linux 系统上启动很多。
$ date
Wed Dec 21 14:06:44 UTC 2022
$ export TZ=Asia/Shanghai
$ date
Wed Dec 21 22:06:52 CST 2022
如果需要是用 TZ 环境变量 实现时区控制, 需要安装 tzdata
这个包。
在 debian/ubuntu 中安装。
debian
的基础镜像默认情况下已经安装了 tzdata
,而 ubuntu
并没有。 tzdata
安装时有交互操作, 需要选择默认时区。 通过 DEBIAN_FRONTEND=noninteractive
进入非交互模式, 直接安装。
DEBIAN_FRONTEND=noninteractive apt install -y tzdata
在 alpine 中安装
apk add --no-cache tzdata
容器中通过 TZ 环境变量
实现时区控制
- 我们需要在构建业务镜像的时候安装
tzdata
并设置 默认时区。 - 在容器启动的时候, 根据需要再通过注入环境变量的方式设置时区。
Dockerfile 以 nginx:debian 为例
FROM nginx:1.23
# 安装 tzdata
RUN apk update \
&& DEBIAN_FRONTEND=noninteractive apt install -y tzdata \
&& rm -rf /var/lib/apt/lists/*
# 设置默认时区
ENV TZ=Asia/Shanghai
# ...省略
假设通过上述 Dockerfile 构建的镜像名为 nginx:1.23-tz-shanghai
。 通过 注入变量 修改时区。
直接使用, 我们将得到 CST 时区。
以下就不通过上述 Dockerfile 构建镜像了。 时区反着来。
默认 nginx:1.23
使用的是 Etc/UTC
时间。
$ docker run --rm nginx:1.23 date
Wed Dec 21 14:23:03 UTC 2022
在启动的时候, 注入上海时区的环境变量
$ docker run --rm -e "TZ=Asia/Shanghai" nginx:1.23 date
Wed Dec 21 22:23:30 CST 2022
docker-compose
或 Kubernetes
通过各自的方式注入环境变量即可。
全球所有可用时区, 参考地址 https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List
相关文章
- JAVA只要掌握内部类,多继承和单继承都不是问题
- 今儿直白的用盖房子为例,给你讲讲Java建造者模式
- 用实例带你深入理解Java内存模型
- 你知道,java项目中是如何获取文件地址的吗?
- 【架构师(第十五篇)】脚手架之创建项目模板开发
- 【架构师(第十六篇)】脚手架之创建项目模板的下载与更新
- 【架构师(第十八篇)】脚手架之项目模板的安装
- 【架构师(第十九篇)】脚手架之组件库模板开发
- 【架构师(第二十篇)】脚手架之自定义模板及第一阶段总结
- 【架构师(第二十一篇)】编辑器开发之需求分析和架构设计
- 【架构师(第二十二篇)】编辑器开发之项目整体搭建
- 【架构师(第二十三篇)】编辑器开发之画布区域组件的渲染
- 【架构师(第二十四篇)】编辑器开发之添加模版到画布
- Java异常处理:如何写出“正确”但被编译器认为有语法错误的程序
- 我以订披萨为例,给女朋友详细讲了Java设计模式的3种工厂模式
- 【架构师(第二十五篇)】编辑器开发之属性编辑区域表单渲染
- 【架构师(第二十六篇)】编辑器开发之属性编辑同步渲染
- 2021年度“CCF-腾讯犀牛鸟基金”发布结题评优结果
- 【架构师(第二十七篇)】前端单元测试框架 Jest 基础知识入门
- 太空噗|重燃太空热潮!与噗噗星人一同探索星海浪漫