构建docker镜像时处理tzdata交互输入

345 阅读2分钟

构建docker镜像时处理tzdata交互输入

使用dockerfile构建ubuntu18.04镜像时,安装的软件包里有依赖项tzdata​,tzdata​安装时会以终端交互的方式提示用户选择地理位置:

    Configuring tzdata
    ------------------
    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      4. Australia  7. Atlantic  10. Pacific  13. Etc
     2. America     5. Arctic     8. Europe    11. SystemV
     3. Antarctica  6. Asia       9. Indian    12. US
    Geographic area:

在制作docker镜像过程中,输入选择项也没有作用,docker会忽略我们的输入,依然会卡在这个界面,或者认为输入了无效选项,时区变为UTC+0。

网上搜索的一些解决方案,建议使用方案二:

  • 安装tzdata​时设置环境变量DEBIAN_FRONTEND=noninteractive​跳过配置选择

    • 该方案验证是可以跳过的,但是进入系统后,查看ls -l /etc/localtime​会发现链接的是默认的ETC/UTC​;
    • 如果确实依赖tzdata​的时区,那么就只能在进入系统后,重新修改tzdata​选择的时区了。
  • 通过管道提前将选择时区写入到stdin​中,例如:echo "Asia\nShanghai" | apt-get install -y tzdata

    • 该方案相比前一个方案,可以选择我们想要的时区,进入系统后,查看ls -l /etc/localtime​链接到了Asia/Shanghai​。

以上两个方案,在制作ubuntu18.04的docker镜像过程中验证没有问题。

另外,这些方案要么修改环境变量,要么修改标准输入,因此最好是单独起一条命令安装tzdata​,这样就不会污染环境变量或者输入的选项被其他安装程序取走了;并且,要把tzdata​的安装放在最前面,否则作为其他软件包的依赖项被安装时,还是需要手动输入的。可以参考下面的写法:

RUN apt-get update \
    && echo "Asia\nShanghai" | apt-get install -y tzdata \
    && apt-get install -y \
    make \
    gcc \
	...

由此也可以引申出,在安装其他软件,或者执行某些指令时,如果也需要提供标准输入,是不是也可以通过echo​写入标准输入的方式,达到自动安装的目的。

参考文档

  1. 构建Docker镜像时处理'Configuring tzdata'交互输入_please select the geographic area in which you liv-CSDN博客
  2. 论如何用一行命令安装和配置好 tzdata - LibXZR 的小本本