问题/现象

最近在公司的CI/DI服务器上尝试使用 drone 的 cron 来配置自动构建测试功能。然而发现配置的 cron表达是总是少了8个小时,于是猜测应该是时区设置的问题。 drone 这个 docker 镜像使用的是 alpine linux。

解决问题

由于docker所属宿主服务器是使用了时间服务器的,因此我希望docker容器的配置与宿主机一致即可。

  1. 首先需要宿主机本身已经安装好了 tzdata
  2. 在你的docker-compose.yml中加入相应的配置
    environment:
        TZ: "Asia/Shanghai"
    volumes:
      - /etc/hosts:/etc/hosts
      - /etc/localtime:/etc/localtime
      - /usr/share/zoneinfo:/usr/share/zoneinfo

在原来的 compose 文件中,我只是增加了 /etc/localtime:/etc/localtime 而没有增加 /usr/share/zoneinfo:/usr/share/zoneinfo 的映射, 详见前文 使用 drone 替代 gitlab action 搭建自动化集成环境 故而实际上是一直未生效的。

这个问题出现的根本原因是使用alpine作为系统的docker镜像默认是没有安装tzdata的,故而其默认的是UTC时间。 如果是你自己制作alpine镜像的话,则最好安装好 tzdata ,免得麻烦。