DEV Community

Set timezone in your docker image

BC on August 13, 2021

TL;DR RUN apt update && apt install tzdata -y ENV TZ="America/New_York" Debian When your imag...
Collapse
 
peter279k profile image
peter279k •

To set correct system timezone on Ubuntu 18.04 or 20.04 base image, it should use following Dockerfile:

FROM ubuntu:18.04

RUN apt-get update && \
    apt-get install -yq tzdata && \
    ln -fs /usr/share/zoneinfo/Asia/Taipei /etc/localtime && \
    dpkg-reconfigure -f noninteractive tzdata
Enter fullscreen mode Exit fullscreen mode
FROM ubuntu:20.04

RUN apt-get update && \
    apt-get install -yq tzdata && \
    ln -fs /usr/share/zoneinfo/Asia/Taipei /etc/localtime && \
    dpkg-reconfigure -f noninteractive tzdata
Enter fullscreen mode Exit fullscreen mode
Collapse
 
bitecode profile image
BC •

Thank you, Peter. Question though, if the one line set env TZ works, what’s the benefits of using your long version ?

Collapse
 
peter279k profile image
peter279k •

Setting ENV TZ cannot be worked for setting system timezone.

For example, using the following Dockefile:

FROM ubuntu:20.04

ENV TZ="Asia/Taipei"
Enter fullscreen mode Exit fullscreen mode

When building above Docker image is done, running this image as container with interactive pseudo terminal:

lee@lee-VirtualBox:~/test$ docker run -it test_timezone:latest bash
root@b16f08e2d542:/#
root@b16f08e2d542:/# date
Sat Aug 14 03:18:44 Asia 2021
Enter fullscreen mode Exit fullscreen mode

The timezone is correct, but current time is incorrect.

Then using the following Dockerfile and build them to be the Docker image:

FROM ubuntu:20.04

RUN apt-get update && \
    apt-get install -yq tzdata && \
    ln -fs /usr/share/zoneinfo/Asia/Taipei /etc/localtime && \
    dpkg-reconfigure -f noninteractive tzdata
Enter fullscreen mode Exit fullscreen mode

After building above Docker image is done, running this as a container with interactive pseudo terminal:

lee@lee-VirtualBox:~/test$ docker run -it test_timezone:tzdata bash
root@9f778cfd6e1a:/# date
Sat Aug 14 11:23:09 CST 2021
root@9f778cfd6e1a:/#
Enter fullscreen mode Exit fullscreen mode
Thread Thread
 
bitecode profile image
BC •

Ah, interesting, thank you. When I was using the "ENV TZ" method, my base image is FROM node:16-slim, and it worked perfectly when run date:

Fri Aug 13 23:47:09 EDT 2021
Enter fullscreen mode Exit fullscreen mode

Do you know why that works while FROM ubuntu:20.04 does not? Is it b/c the node:16 image already set the tzdata like you did?

Thread Thread
 
peter279k profile image
peter279k • • Edited

The node:16-slim is based on Debian:10 image to build the Node.js version 16 environment.

And it's worked for Debian 10 when setting the ENV TZ to set the timezone.

I think setting ENV TZ is not the common way to set system timezone on every Linux distributions.

Thread Thread
 
bitecode profile image
BC •

Hmm, you are right, just tried FROM debian:10 , the ENV TZ way works. Seems just not working for ubuntu. Thank you for pointing out. TIL.

Collapse
 
brentgroves profile image
Brent Groves • • Edited

For ubuntu 22.04 I suggest blog.game-changing.de/how-to-set-t...
The author explains the details but the gist is to include the following in your dockerfile.

FROM ubuntu:22.04

ARG DEBIAN_FRONTEND=noninteractive

ENV TZ Europe/Berlin

RUN apt-get update \
&& apt-get install -yq tzdata locales \
&& rm -rf /var/lib/apt/lists/* \

&& sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen \
&& locale-gen \
&& ln -fs /usr/share/zoneinfo/${TZ} /etc/localtime \
&& dpkg-reconfigure tzdata

ENV LANG en_US.UTF-8

ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8

CMD ["/bin/bash"]

Collapse
 
kavindugeesara profile image
KavinduGeesara • • Edited

Could you please tell me how to set on alpine base image?

my dockerfile is like this:

FROM alpine
ENV TZ="Asia/Colombo"

Collapse
 
bitecode profile image
BC • • Edited

I think you need to install the tzdata first before setting the TZ, like ubuntu:

FROM alpine:latest

RUN apk update && apk add tzdata
ENV TZ="America/New_York"
Enter fullscreen mode Exit fullscreen mode

This works for me.