TL;DR
RUN apt update && apt install tzdata -y
ENV TZ="America/New_York"
Debian
When your image is based on Debian, or your image's root is based on Debian, you can use ENV TZ
in Dockerfile
:
FROM debian:10
ENV TZ="America/New_York"
Ubuntu
When your image/root-image is based on Ubuntu, use:
RUN apt-get update && \
apt-get install -yq tzdata && \
ln -fs /usr/share/zoneinfo/America/New_York /etc/localtime && \
dpkg-reconfigure -f noninteractive tzdata
If you don't know what your base image is, you could try putting both:
RUN apt-get update && \
apt-get install -yq tzdata && \
ln -fs /usr/share/zoneinfo/America/New_York /etc/localtime && \
dpkg-reconfigure -f noninteractive tzdata
ENV TZ="America/New_York"
Also quote from and credits to @peter279k in the comment below:
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, theDebian
andCentOS
have thetzdata
installed on their Base Docker images.
And Ubuntu doesn't have the tzdata package on the Docker base image.
So another solution is:
RUN apt update && apt install tzdata -y
ENV TZ="America/New_York"
Top comments (12)
To set correct system timezone on Ubuntu 18.04 or 20.04 base image, it should use following
Dockerfile
:Thank you, Peter. Question though, if the one line set env TZ works, whatโs the benefits of using your long version ?
Setting ENV TZ cannot be worked for setting system timezone.
For example, using the following
Dockefile
:When building above
Docker
image is done, running this image as container with interactive pseudo terminal:The timezone is correct, but current time is incorrect.
Then using the following
Dockerfile
and build them to be the Docker image:After building above Docker image is done, running this as a container with interactive pseudo terminal:
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 rundate
: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?The
node:16-slim
is based onDebian:10
image to build the Node.js version 16 environment.And it's worked for
Debian 10
when setting theENV
TZ to set the timezone.I think setting
ENV
TZ is not the common way to set system timezone on every Linux distributions.Hmm, you are right, just tried
FROM debian:10
, theENV TZ
way works. Seems just not working for ubuntu. Thank you for pointing out. TIL.If using the
ENV
to set TZ to set the timezone, it should have thetzdata
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.That's the reason why I need to use
apt-get update
andapt-get install -yq tzdata
firstly on myDockerfile
when using theUbuntu 20.04
for my Docker base image.Of course, we can simplify my
Dockerfile
when using theUbuntu
to be the Docker base image:Got it, thanks for the awesome explanation. ๐
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"]
Could you please tell me how to set on alpine base image?
my dockerfile is like this:
FROM alpine
ENV TZ="Asia/Colombo"
I think you need to install the
tzdata
first before setting the TZ, like ubuntu:This works for me.