前言
这些天花了点时间把这个 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
软件包,一堆软件包一起装鬼知道输进去的东西会不会被啥吞了。。。
博主威武,感谢指导!
echo -e "Asia\nShanghai" 才对
试了一下,zsh 下不使用 -e 也可以正常显示换行,但是 bash 不行。不过 docker 里跑这条命令的时候,没有 -e 也是能正常识别的。不确定这里面具体的变数在哪里,不过是一个很好的提醒。
```
➜ ~ echo "Asia\nShanghai"
Asia
Shanghai
➜ ~ bash
libxzr@MSI:~$ echo "Asia\nShanghai"
Asia\nShanghai
libxzr@MSI:~$ echo -e "Asia\nShanghai"
Asia
Shanghai
```