两种方式解决 Docker 时区问题

324次阅读
没有评论

共计 1366 个字符,预计需要花费 4 分钟才能阅读完成。

对于经常使用 Docker 的人来说,可能会碰到一个问题:时区问题。

大部分 Docker 镜像都是基于 Alpine,Ubuntu,Debian,CentOS 等基础镜像制作而成。

基本上都采用 UTC 时间,默认时区为零时区。

# 运行命令 
docker run --rm -it alpine date
# 输出时间
Fri Nov 29 08:14:49 UTC 2019

而我们主要用的是 CST 时间,北京时间,位于东八区。时区代号: Asia/Shanghai

# 运行命令
docker run --rm -it -v /etc/timezone:/etc/timezone:ro -v /etc/localtime:/etc/localtime:ro alpine date
# 输出时间
Fri Nov 29 16:13:55 CST 201

对比一下会发现,时间上相差 8 小时。

下面是针对使用别人的容器和自己构建镜像的解决方式。

1. 通用时区修改方案

这种方式是将宿主机的时区映射到容器内,容器与宿主机的时区保持一致。

-v /etc/timezone:/etc/timezone:ro -v /etc/localtime:/etc/localtime:ro

2. 自己构建镜像

通过编写 Dockerfile,构建自己的 Docker 镜像,可以永久解决时区问题。

alpine

将以下代码添加到 Dockerfile 中:

ENV TZ Asia/Shanghai

RUN apk add tzdata && cp /usr/share/zoneinfo/${TZ} /etc/localtime \
    && echo ${TZ} > /etc/timezone \
    && apk del tzdata

debain

Debian 基础镜像 中已经安装了 tzdata 包,可以将以下代码添加到 Dockerfile 中:

ENV TZ=Asia/Shanghai \
    DEBIAN_FRONTEND=noninteractive

RUN ln -fs /usr/share/zoneinfo/${TZ} /etc/localtime \
    && echo ${TZ} > /etc/timezone \
    && dpkg-reconfigure --frontend noninteractive tzdata \
    && rm -rf /var/lib/apt/lists/*

Ubuntu

Ubuntu 基础镜像中没有安装了 tzdata 包,因此需要先安装 tzdata 包,将以下代码添加到 Dockerfile 中。

ENV TZ=Asia/Shanghai \
    DEBIAN_FRONTEND=noninteractive

RUN apt update \
    && apt install -y tzdata \
    && ln -fs /usr/share/zoneinfo/${TZ} /etc/localtime \
    && echo ${TZ} > /etc/timezone \
    && dpkg-reconfigure --frontend noninteractive tzdata \
    && rm -rf /var/lib/apt/lists/*

CentOS

CentOS 基础镜像中已经安装了 tzdata 包,可以将以下代码添加到 Dockerfile 中。

ENV TZ Asia/Shanghai

RUN ln -fs /usr/share/zoneinfo/${TZ} /etc/localtime \
    && echo ${TZ} > /etc/timezone

提醒:本文发布于502天前,文中所关联的信息可能已发生改变,请知悉!

AD:【腾讯云服务器大降价】2核4G 222元/3年 1核2G 38元/年
正文完
 
阿蛮君
版权声明:本站原创文章,由 阿蛮君 2023-03-11发表,共计1366字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
Copyright © 2022-2024 阿蛮君博客 湘ICP备2023001393号
本网站由 亿信互联 提供云计算服务 | 蓝易云CDN 提供安全防护和加速服务
Powered by Wordpress  Theme by Puock