前端SSG时区问题
问题描述
由于博客采用SSG的方式,然后会在devops阶段进行构建,然后我们采用docker镜像的方式进行构建。
然后当生成文章是什么时候发布的时候,明明是12小时发布的,显示差了8小时。
然后怀疑是哪个环节时区有问题了。
 
相关知识点
在 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,所以修改如下:
| 12
 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 包,我们只需如下操作:
| 12
 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 包。
| 12
 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 包,只需如下操作:
| 12
 3
 4
 
 | ENV TZ Asia/Shanghai
 RUN ln -fs /usr/share/zoneinfo/${TZ} /etc/localtime \
 && echo ${TZ} > /etc/timezone
 
 | 
最后处理
由于我们的dockerfile是采用alpine,所以按照上面alpine的方式。
修改后如下:
| 12
 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
 
 |