发布于 

前端SSG时区问题

问题描述

由于博客采用SSG的方式,然后会在devops阶段进行构建,然后我们采用docker镜像的方式进行构建。

然后当生成文章是什么时候发布的时候,明明是12小时发布的,显示差了8小时。

然后怀疑是哪个环节时区有问题了。

img

相关知识点

在 Linux 系统中,控制时区和时间的主要是两个地方:

  • /etc/timezone 主要代表当前时区设置,一般链接指向 /usr/share/zoneinfo 目录下的具体时区。
  • /etc/localtime 主要代表当前时区设置下的本地时间。

解决办法

映射方式

如果宿主机也是linux,我们可以将上面两个文件通过 -v ${}:${}的方式映射进去解决。

环境变量方式

  • 适用于基于 Debian 基础镜像, CentOS 基础镜像 制作的 Docker 镜像
  • 不适用于基于 Alpine 基础镜像, Ubuntu 基础镜像 制作的 Docker 镜像
1
docker run -e TZ=Asia/Shanghai

修改dockerfile

根据使用的基础镜像使用的操作系统不同,调整的方式也有所不同

alpine

我们由于是用的alpine,所以修改如下:

1
2
3
4
5
ENV TZ Asia/Shanghai

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

Debian

Debian 基础镜像 中已经安装了 tzdata 包,我们只需如下操作:

1
2
3
4
5
6
7
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 包。

1
2
3
4
5
6
7
8
9
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 包,只需如下操作:

1
2
3
4
ENV TZ Asia/Shanghai

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

最后处理

由于我们的dockerfile是采用alpine,所以按照上面alpine的方式。

修改后如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
FROM node:18-alpine AS build

ENV TZ Asia/Shanghai

RUN apk update && apk add bash

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

WORKDIR /home

COPY ./package.json /home

RUN npm install --registry=https://registry.npmmirror.com

COPY . /home

RUN npm run build

如果你有什么意见和建议,可以点击: 反馈地址 进行反馈。