在使用Docker容器时,可能碰到的一个问题是时区的设置,因为Docker容器内默认的时区是UTC,这一点可以通过date命令来验证。分别在宿主机和Docker容器内运行date命令,观察两者的输出是否相同。
容器的时区需要统一,方法有二,一是制作镜像时在Dockerfile文件中配置,而是启动容器时设置参数。
- Dockerfile设置
- alpine系统配置
已经启动的基于alpine的容器,可以进入容器内部修改 ```bash docker exec -it container_name /bin/shRUN apk update \
&& apk add tzdata \
&& cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo "Asia/Shanghai" > /etc/timezone \
&& apk del tzdata \
&& rm -rf /var/cache/apk/*
- alpine系统配置
安装 timezone 数据包
为了防止添加失败,加上-U参数,更新仓储缓存。
列出安装的时区文件,验证是否下载成功。
apk add -U tzdata # ls /usr/share/zoneinfo
拷贝需要的时区文件到localtime,国内需要的是Asia/Shanghai
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
验证时区
date
移除时区文件
为了保证容器的精简和轻量,移除下载的时区文件。
apk del tzdata
2. ubuntu系统配置
```bash
RUN apt-get update
RUN export DEBIAN_FRONTEND=noninteractive
RUN apt-get install -y tzdata=2018d-1
RUN ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN dpkg-reconfigure -f noninteractive tzdata
- centos系统配置
# 使用RUN命令设置时区
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo 'Asia/Shanghai'>/etc/timezone
- 创建容器时参数设置映射宿主时区
```bash
docker run -it —name sample_alphine -v /etc/localtime:/etc/localtime -d alphine:lastest
-v /etc/localtime:/etc/localtime 映射宿主机的时区
3. 正在运行的容器修改时区一
```bash
#进入容器
docker exec -it 容器ID bash
#将宿主机的时区链接到容器里面
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
#退出容器并重启容器
exit
docker restart 容器ID
alpine内修改
apk add tzdata
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime echo "Asia/Shanghai" > /etc/timezone
正在运行的容器修改时区二
docker cp /etc/localtime [容器ID或者NAME]:/etc/localtime
docker compose设置时区 ```bash 方式一: environment:
- SET_CONTAINER_TIMEZONE=true
- CONTAINER_TIMEZONE=Asia/Shanghai
方式二: environment:
- TZ=Asia/Shanghai ```