dpkg-reconfigure tzdata的非交互式方法



当我第一次设置Ubuntu服务器时,我确保我是aptitude install tzdata,然后是dpkg-reconfigure tzdata,以便我正确设置我的时区。

我正在尝试用脚本自动化我的服务器设置,并注意到这部分有点像把扳手扔到它是自动的,因为它需要一个交互式会话与用户的干预。

是否有一种方法可以使用dpkg-reconfigure而不需要它是交互式的?

泔水的答案不是如何正确地做。如果您想要无人参与/脚本化的包的dpkg配置,那么您需要使用debconf预播种机制。

在你的情况下,这意味着你必须做以下事情:

  • 设置以下环境变量以避免debconf试图询问用户任何问题:

    export DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true
    
  • 然后用下面的preseed.txt文件预种子debconf(或者你想要的任何其他设置):

    tzdata tzdata/Areas select Europe
    tzdata tzdata/Zones/Europe select Berlin
    
  • 您可以通过以下命令设置上述预种子文件:

    debconf-set-selections /your/preseed.txt
    
  • 你现在可以安装tzdata(如果它还没有安装)通过apt或运行dpkg-reconfigure。最后,tzdata将根据您在debconf preseed文件中指定的内容进行设置。

请记住,您可以使用debconf pre播自动执行更多操作。例如在我的preseeds中,我总是设置:

locales locales/locales_to_be_generated multiselect     en_US.UTF-8 UTF-8
locales locales/default_environment_locale      select  en_US.UTF-8

你可以通过运行debconf-get-selections来检查当前系统的debconf设置。输出应该让您了解使用debconf pre播可以自动化多少系统配置。

Dockerfile:

FROM ubuntu:xenial
## for apt to be noninteractive
ENV DEBIAN_FRONTEND noninteractive
ENV DEBCONF_NONINTERACTIVE_SEEN true
## preesed tzdata, update package index, upgrade packages and install needed software
RUN truncate -s0 /tmp/preseed.cfg; 
    echo "tzdata tzdata/Areas select Europe" >> /tmp/preseed.cfg; 
    echo "tzdata tzdata/Zones/Europe select Berlin" >> /tmp/preseed.cfg; 
    debconf-set-selections /tmp/preseed.cfg && 
    rm -f /etc/timezone /etc/localtime && 
    apt-get update && 
    apt-get install -y tzdata
## cleanup of files from setup
RUN rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

在我的实验中,我确定删除/etc中的文件是必要的。

在16.04中有一个bug (https://bugs.launchpad.net/ubuntu/+source/tzdata/+bug/1554806,在编写此答案时未修复),导致/etc/timezone的内容在运行dpkg-reconfigure -f noninteractive tzdata时被旧值覆盖。修复方法如下(来自上面的bug报告):

$ sudo ln -fs /usr/share/zoneinfo/America/New_York /etc/localtime
$ sudo dpkg-reconfigure --frontend noninteractive tzdata
Current default time zone: 'America/New_York'
Local time is now:      Mon Feb 20 07:30:33 EST 2017.
Universal Time is now:  Mon Feb 20 12:30:33 UTC 2017.
$ cat /etc/timezone
America/New_York

无需手动修改/etc/timezone的内容。

这是我对最新Ubuntu 18.04 LTS发行版的Dockerfile,改编自@NilsBallmann的回答。我还删除了临时文件创建,并将包安装压缩到单个层:

FROM ubuntu:bionic
RUN export DEBIAN_FRONTEND=noninteractive; 
    export DEBCONF_NONINTERACTIVE_SEEN=true; 
    echo 'tzdata tzdata/Areas select Etc' | debconf-set-selections; 
    echo 'tzdata tzdata/Zones/Etc select UTC' | debconf-set-selections; 
    apt-get update -qqy 
 && apt-get install -qqy --no-install-recommends 
        tzdata 
 && apt-get clean 
 && rm -rf /var/lib/apt/lists/*

推进josch的答案;设置debconf db值和在运行dpkg-reconfigure之前删除/etc/{localtime,timezone} :-

$ echo "tzdata tzdata/Areas select Europe" > some/file.txt
$ echo "tzdata tzdata/Zones/Europe select Berlin" >> some/file.txt
$ sudo debconf-set-selections some/file.txt
$ sudo rm /etc/timezone
$ sudo rm /etc/localtime
$ sudo dpkg-reconfigure -f noninteractive tzdata
Current default time zone: 'Europe/Berlin'
Local time is now:      Thu Sep  1 17:13:16 CEST 2016.
Universal Time is now:  Thu Sep  1 15:13:16 UTC 2016.

此方法已知适用于:-

  • ubuntu Trusty (14.04.5 LTS)

在Ubuntu 18.04和systemd中,我使用:

  $ sudo timedatectl set-timezone 'Europe/Madrid'
  $ sudo dpkg-reconfigure --frontend noninteractive tzdata

相关内容

  • 没有找到相关文章

最新更新