在使用Docker容器时,可能碰到的一个问题是时区的设置,因为Docker容器内默认的时区是UTC,这一点可以通过date命令来验证。分别在宿主机和Docker容器内运行date命令,观察两者的输出是否相同。
容器的时区需要统一,方法有二,一是制作镜像时在Dockerfile文件中配置,而是启动容器时设置参数。

  1. Dockerfile设置
    1. alpine系统配置
      1. RUN apk update \
      2. && apk add tzdata \
      3. && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
      4. && echo "Asia/Shanghai" > /etc/timezone \
      5. && apk del tzdata \
      6. && rm -rf /var/cache/apk/*
      已经启动的基于alpine的容器,可以进入容器内部修改 ```bash docker exec -it container_name /bin/sh

安装 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

  1. 2. ubuntu系统配置
  2. ```bash
  3. RUN apt-get update
  4. RUN export DEBIAN_FRONTEND=noninteractive
  5. RUN apt-get install -y tzdata=2018d-1
  6. RUN ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  7. RUN dpkg-reconfigure -f noninteractive tzdata
  1. centos系统配置
    1. # 使用RUN命令设置时区
    2. RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    3. && echo 'Asia/Shanghai'>/etc/timezone
  1. 创建容器时参数设置映射宿主时区 ```bash

    docker run -it —name sample_alphine -v /etc/localtime:/etc/localtime -d alphine:lastest

-v /etc/localtime:/etc/localtime 映射宿主机的时区

  1. 3. 正在运行的容器修改时区一
  2. ```bash
  3. #进入容器
  4. docker exec -it 容器ID bash
  5. #将宿主机的时区链接到容器里面
  6. ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  7. #退出容器并重启容器
  8. exit
  9. docker restart 容器ID

alpine内修改

  1. apk add tzdata
  2. ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime echo "Asia/Shanghai" > /etc/timezone
  1. 正在运行的容器修改时区二

    1. docker cp /etc/localtime [容器ID或者NAME]:/etc/localtime
  2. docker compose设置时区 ```bash 方式一: environment:

    • SET_CONTAINER_TIMEZONE=true
    • CONTAINER_TIMEZONE=Asia/Shanghai

方式二: environment:

  • TZ=Asia/Shanghai ```