# 时区设置

容器系统时间默认为 UTC 协调世界时间（Universal Time Coordinated），与本地所属时区 CST（上海时间）相差 8 个小时。当需要获取系统时间用于日志记录、数据库存储等相关操作时，容器内时区不一致问题将会带来一系列困扰。

在构建基础镜像或在基础镜像的基础上制作自定义镜像时，在 Dockerfile 中创建时区文件即可解决单一容器内时区不一致问题，且后续使用该镜像时，将不再受时区问题困扰。

## 前期判断

首先需要判断自己的 `FROM` 镜像是什么系统，来确定接下来执行的步骤是什么。

举个例子，一个 Dockerfile 文件内容如下：

``` dockerfile
FROM node:12-slim
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install --only=production
COPY . ./
CMD [ "node", "index.js" ]
```

我们可以通过在自己电脑安装 Docker，运行如下命令查看

``` bash
# node:12-slim替换成自己的
docker pull node:12-slim
docker run -it node:12-slim bash
# 进入容器内部
cat /etc/issue
```

就可以看到此镜像对应的系统类型
``` log
Debian GNU/Linux 9 \n \l
```

如果你已经部署了一次服务在微信云托管中，可以前往服务进入实例，运行以下命令，也可以查看到对应的类型。

![](https://res8.wxqcloud.qq.com.cn/wxdoc/c56fe2b0-987c-4cfc-b090-fb485ed0c8d5.png)

如果你的 Dockerfile 中有多个 FROM，则取最后一次出现的 FROM 来判断。

## 添加时区命令

按照上一步骤确定的系统，选择下述正确的命令添加到你原有 Dockerfile 中 `CMD` 上面，在 `FROM` 和 `CMD` 之间，如果你的构建过程中有用到时区，则在需要时区的命令之前添加。

### 1. Alpine

Alpine 比较精简，需要安装 tzdata，可以将你自己的安装步骤与下述步骤合并

``` bash
ENV TZ Asia/Shanghai
RUN apk add tzdata && cp /usr/share/zoneinfo/${TZ} /etc/localtime && echo ${TZ} > /etc/timezone && apk del tzdata
```

如果报超时等错误，需要在前面配置软件源，添加如下代码

``` bash
set -eux && sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories
```

如果设置完时区仍然不对，请删除最后的 `apk del tzdata` 重新打包上传

### 2. Debian

``` bash
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/*
```

上述例子中，就变成如下：

``` dockerfile
FROM node:12-slim
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/*
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install --only=production
COPY . ./
CMD [ "node", "index.js" ]
```

### 3. Ubuntu

Ubuntu 基础镜像中没有 tzdata 包，所以下述命令使用 apt 安装了一下，如果你的原有 Dockerfile 中有 apt 安装步骤，需要整合一下代码。

``` bash
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/*
```

### 4. CentOS

``` bash
ENV TZ Asia/Shanghai

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

## 总结

设置好时区后，可以使用下述命令测试一下

``` bash
date
### 原来 >>> Mon Mar 14 02:36:27 UTC 2022
### 修改 >>> Mon Mar 14 10:36:16 CST 2022
```

上述方法如果有不适用，可以在[官方交流群](https://www.cloudbase.vip/scan/?code=werun)联系我们。
