问题描述
首次设置Ubuntu服务器时,请确保先设置aptitude install tzdata
,然后再设置dpkg-reconfigure tzdata
,以便正确设置时区。
我正在尝试使用脚本来自动化服务器设置,并且注意到这种自动操作是一种麻烦,因为它需要用户干预的交互式会话。
有没有办法使用dpkg-reconfigure而不进行交互?
最佳回答
更新:这个问题现在是StackOverflow的off-topic。请参阅the correct answer on ServerFault。
次佳回答
swill的答案不是如何正确完成。如果要无人值守/脚本化的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
-
您现在可以通过
apt
安装tzdata(如果尚未安装)或运行dpkg-reconfigure
。最后,将根据您在debconf预置文件中指定的内容来设置tzdata。
记住,您可以使用debconf preseeding使更多的工作自动化。例如,在我的前提下,我总是设置:
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 preseeding能够自动化多少系统配置有所了解。
第三种回答
16.04中存在一个错误(https://bugs.launchpad.net/ubuntu/+source/tzdata/+bug/1554806,在编写此答案时尚未修复),该错误会导致在运行dpkg-reconfigure -f noninteractive tzdata
时用旧值覆盖/etc/timezone
的内容。该修复程序如下(来自上述错误报告):
$ 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 16.04.2 LTS上对我有用。
第四种回答
在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 echo "tzdata tzdata/Areas select Europe" > /tmp/preseed.txt; \
echo "tzdata tzdata/Zones/Europe select Berlin" >> /tmp/preseed.txt; \
debconf-set-selections /tmp/preseed.txt && \
rm /etc/timezone && \
rm /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
中的文件。
第五种回答
推进josch的回答;在运行dpkg-reconfigure
之前,设置debconf db值并删除/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.
已知此方法可用于:-
-
Ubunty Trusty(14.04.5 LTS)
第六种回答
这是我最新的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/*