136
votes

When I try to

apt-get install -y tzdata

the command line option for picking timezone shows up. I am trying to use this in a script to do some setup, how can I make the apt-get run without user input?

I know to reconfigure the tzdata I can do

echo "America/New_York" > /etc/timezone
dpkg-reconfigure -f noninteractive tzdata

But when installing I need it to run fully even if it doesn't set the right timezone, I can always reconfigure it.

I tried

echo 5 | apt-get install -y tzdata

but it is not working as expected.

7

7 Answers

219
votes

This is the script I used

(Updated Version with input from @elquimista from the comments)

#!/bin/bash
export DEBIAN_FRONTEND=noninteractive

ln -fs /usr/share/zoneinfo/America/New_York /etc/localtime
apt-get install -y tzdata
dpkg-reconfigure --frontend noninteractive tzdata

Seems to work fine.

As one liner:

DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends tzdata
101
votes

If someone wants to achieve it in Dockerfile, use as below.

ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get -y install tzdata
8
votes

I have recently found the following solution in a Dockerfile building the Cingulata FHE library:

ln -snf /usr/share/zoneinfo/$(curl https://ipapi.co/timezone) /etc/localtime

It basically uses the API provided by ipapi.co to retrieve the timezone information. This automatically configures the timezone properly instead of skipping the dialog and using the default (UTC).

7
votes

All credit for this should go to @PYA but the right order should be:

ln -fs /usr/share/zoneinfo/America/New_York /etc/localtime
export DEBIAN_FRONTEND=noninteractive
apt-get install -y tzdata
dpkg-reconfigure --frontend noninteractive tzdata
3
votes

here is what worked for me:

from ubuntu:bionic
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y tzdata

RUN unlink /etc/localtime
RUN ln -s /usr/share/zoneinfo/America/New_York /etc/localtime
3
votes

To avoid playing directly with symlinks and to run configuration only once, I suggest to use debconf-set-selections command:

echo 'tzdata tzdata/Areas select Europe' | debconf-set-selections
echo 'tzdata tzdata/Zones/Europe select Paris' | debconf-set-selections
DEBIAN_FRONTEND="noninteractive" apt install -y tzdata
2
votes

Here is how I did it:

echo 1 > input.txt
echo 1 >> input.txt
apt-get install -y tzdata < input.txt
ln -fs /usr/share/zoneinfo/America/Los_Angeles /etc/localtime
echo America/Los_Angeles > /etc/timezone

The first two echo statements create a text file that contains the selection numbers for the geographic area menu and the city/region menu. This file is then used to provide input to the apt-get install command. The tzdata package will be installed without asking for any user input. The timezone will be set to Africa/Abidjan as if you entered 1 and 1 in response to the prompts you would normally get. Then I change the timezone to what I want with the last two commands.

Instead of 1 and 1, you could use the actual numbers for the geographic area and city/region that you want, but it seems to me that those numbers could change.