原来 Docker 容器中设置时区这么简单

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 大家好, 我是老麦。 今天我们一起讨论一下容器时区的问题。

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 环境变量 实现时区控制

  1. 我们需要在构建业务镜像的时候安装 tzdata 并设置 默认时区
  2. 在容器启动的时候, 根据需要再通过注入环境变量的方式设置时区。

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-composeKubernetes 通过各自的方式注入环境变量即可。

全球所有可用时区, 参考地址 https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List

相关文章
|
4天前
|
JSON JavaScript 开发者
Composerize神器:自动化转换Docker运行命令至Compose配置,简化容器部署流程
【8月更文挑战第7天】Composerize神器:自动化转换Docker运行命令至Compose配置,简化容器部署流程
Composerize神器:自动化转换Docker运行命令至Compose配置,简化容器部署流程
|
1天前
|
Docker 容器
|
1天前
|
网络协议 Linux 网络安全
遇到Docker容器网络隔断?揭秘六种超级实用解决方案,轻松让Docker容器畅游互联网!
【8月更文挑战第18天】Docker容器内网络不通是开发者常遇问题,可能因网络配置错、Docker服务异常或防火墙阻碍等原因引起。本文提供六种解决策略:确认Docker服务运行状态、重启Docker服务、检查与自定义Docker网络设置、验证宿主机网络连接、临时禁用宿主机IPv6及检查防火墙规则。通过这些步骤,多数网络问题可得以解决,确保容器正常联网。
9 1
|
3天前
|
安全 Ubuntu Docker
深度挖掘Docker 容器
【8月更文挑战第16天】Docker容器间的连接是容器化技术的关键,支持容器与宿主机的数据交换。主要方法包括:1) 利用Docker网络驱动创建自定义网络,使容器相连通信;2) 采用Docker Compose通过配置文件简化多容器应用的部署与互联;3) 虽不推荐,早期使用--link参数实现容器互联;4) 通过环境变量配置连接信息;5) 共享卷支持文件共享和间接通信。推荐使用Docker网络和Docker Compose以实现高效灵活的容器间通信。
14 3
|
4天前
|
Ubuntu Linux Docker
使用Docker进行容器化:从零开始的技术博文
【8月更文挑战第16天】从零开始掌握Docker容器化技术:本文详细介绍Docker基本概念、安装配置流程及核心组件。涵盖Docker镜像与容器管理、镜像加速配置,以及如何利用Dockerfile自动化构建镜像,助您快速入门并高效运用Docker进行软件开发与部署。
|
4天前
|
Docker 容器
Docker - 网络模式与容器网络互连
Docker的网络模式包括桥接模式、主机模式和覆盖网络模式,以及如何通过Docker的网络操作命令实现容器网络互连。
12 0
|
4天前
|
Linux Docker 容器
在CentOS操作系统上使用yum安装/使用/卸载Docker容器引擎
在CentOS操作系统上安装、配置、使用和卸载Docker容器引擎的详细步骤,包括配置Docker镜像加速的方法。
25 0
|
4天前
|
存储 Ubuntu Linux
如何在 Ubuntu 上使用 Docker 容器化和部署多个 WordPress 应用程序
如何在 Ubuntu 上使用 Docker 容器化和部署多个 WordPress 应用程序
11 0
|
5天前
|
Ubuntu NoSQL 关系型数据库
在Ubuntu操作系统上安装/使用/卸载Docker容器引擎
这篇文章详细介绍了在Ubuntu操作系统上安装、配置、使用、基本操作以及卸载Docker容器引擎的步骤,包括配置Docker镜像加速和使用Docker部署Nginx、MySQL和Redis服务器的方法。
24 0
|
23天前
|
Shell 应用服务中间件 nginx
docker 服务,镜像,容器命令总结
docker 服务,镜像,容器命令总结
110 4