论如何用一行命令安装和配置好 tzdata

前言

这些天花了点时间把 blog 迁移到了 docker 上,中间在使用 docker build 制作镜像时遇到了 tzdata 软件包难以配置的问题。tzdata 在安装时会弹出一堆选择大洲、地点以确定时区的选项,但是这是在制作 docker 镜像,我们没办法像平时那样输入数字(或者名称)进行选择,这会导致这整个过程被跳过(它认为你输入了无效选项),然后时区变为 UTC + 0,更有甚者直接卡在那里不动了。。。

Please select the geographic area in which you live. Subsequent configuration
questions will narrow this down by presenting a list of cities, representing
the time zones in which they are located.

  1. Africa   3. Antarctica  5. Arctic  7. Atlantic  9. Indian    11. US
  2. America  4. Australia   6. Asia    8. Europe    10. Pacific  12. Etc
Geographic area: 
Use of uninitialized value $_[1] in join or string at /usr/share/perl5/Debconf/DbDriver/Stack.pm line 111.

Current default time zone: '/UTC'

网上的解决方案

https://serverfault.com/questions/949991/how-to-install-tzdata-on-a-ubuntu-docker-image

嗯,怎么说呢,没一个能用的?,可能是因为这是一个三年前的问题。
网上的答案都是清一色的类似:

  • 先使用 DEBIAN_FRONTEND=noninteractive 环境变量跳过安装时的配置 (这个确实能跳过)
  • 可以使用类似 TZ=Asia/Shanghai 的环境变量来让它自动配置 (这个完全没有效果,还是卡在 UTC+0 )
  • 可以 ln -fs /usr/share/zoneinfo/Asian/Shanghai /etc/localtime 之后 dpkg-reconfigure (这个也不行,卡在 UTC+0)

优雅的解决

有没有一种可能,我们可以不需要这些软件包“开后门”,直接装作自己是 interactive shell 把选项输进去完事?
这玩意儿不就是读的 stdin 么,直接塞进去一个好了。
那 echo "Asia\nShanghai" | apt-get install -y tzdata ?
欸嘿,还真就直接搞定了。。。

试了 ubuntu 20.04 与 22.04 的 docker 镜像,执行这一过程都没有任何问题。
当然,最好单装 tzdata 软件包,一堆软件包一起装鬼知道输进去的东西会不会被啥吞了。