DEV Community

Discussion on: Set timezone in your docker image

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.

Thread Thread
 
peter279k profile image
peter279k

If using the ENV to set TZ to set the timezone, it should have the tzdata package installed on Linux distribution Docker base image.

After investigating some common Linux distributions, the Debian and CentOS have the tzdata installed on their Base Docker images.

And Ubuntu doesn't have the tzdata package on the Docker base image.

Thread Thread
 
peter279k profile image
peter279k

That's the reason why I need to use apt-get update and apt-get install -yq tzdata firstly on my Dockerfile when using the Ubuntu 20.04 for my Docker base image.

Of course, we can simplify my Dockerfile when using the Ubuntu to be the Docker base image:

FROM ubuntu:20.04

RUN apt-get update && \
    apt-get install -yq tzdata

ENV TZ="Asia/Taipei"
Enter fullscreen mode Exit fullscreen mode
Thread Thread
 
bitecode profile image
BC

Got it, thanks for the awesome explanation. πŸ‘