前端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,所以修改如下:
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
|