Time in Docker container out of sync with host machine
Docker containers don't maintain a separate clock, it's identical to the Linux host since time is not a namespaced value. This is also why Docker removes the permission to change the time inside the container, since that would impact the host and other containers, breaking the isolation model.
However, on Docker Desktop, docker runs inside of a VM (allowing you to run Linux containers on non-Linux desktops), and that VM's time can get out of sync when the laptop is suspended. This is currently being tracked in an issue over on github which you can follow to see the progress: https://github.com/docker/for-win/issues/4526
Potential solutions include restarting your computer, restarting docker's VM, running NTP as a privileged container, or resetting the time sync in the windows VM with the following PowerShell:
Get-VMIntegrationService -VMName DockerDesktopVM -Name "Time Synchronization" | Disable-VMIntegrationService
Get-VMIntegrationService -VMName DockerDesktopVM -Name "Time Synchronization" | Enable-VMIntegrationService
With WSL 2, restarting the VM involves:
wsl --shutdown
wsl
Docker Container time & timezone (will not reflect changes)
The secret here is that dpkg-reconfigure tzdata
simply creates /etc/localtime
as a copy, hardlink or symlink (a symlink is preferred) to a file in /usr/share/zoneinfo
. So it is possible to do this entirely from your Dockerfile. Consider:
ENV TZ=America/Los_Angeles
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
And as a bonus, TZ will be set correctly in the container as well.
This is also distribution-agnostic, so it works with pretty much any Linux.
Note: if you are using an alpine based image you have to install the tzdata
first. (see this issue here)
Looks like this:
RUN apk add --no-cache tzdata
ENV TZ America/Los_Angeles
How to set time in Docker container at build time
So @JanGaraj's answer gave me an important lead: Alpine 3.14's release notes mention that it requires Docker >=20.10.0
(I am currently on 19.03.15
).
Going back to Alpine 3.13's release notes:
- The Docker version requirement is
19.03.9
[which I have] - along with
libseccomp 2.4.2
Simply using FROM alpine:3.13
still didn't work.
Checking the second requirement, I had a previous version of libseccomp[2]
and web-searching led me to this post: https://blog.samcater.com/fix-workaround-rpi4-docker-libseccomp2-docker-20/
Using the steps therein to upgrade libseccomp[2]
did the trick for both alpine:3.13
and alpine:3.14
!!
The steps to fix (from the post)
The steps for libseccomp2 are well documented, as this has been a problem on multiple platforms (not just RPI4). You could do a 'oneshot' installation of a newer version, which can be found here https://github.com/itzg/docker-minecraft-server/issues/755#issuecomment-781615497
Personally I feel the better method is to install it from the Buster Backports repo, which is very safe to add. It also means any future updates to libseccomp will be applied to the Pi.
# Get signing keys to verify the new packages, otherwise they will not install
rpi ~$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 04EE7237B7D453EC 648ACFD622F3D138
# Add the Buster backport repository to apt sources.list
rpi ~$ echo 'deb http://httpredir.debian.org/debian buster-backports main contrib non-free' | sudo tee -a /etc/apt/sources.list.d/debian-backports.list
rpi ~$ sudo apt update
rpi ~$ sudo apt install libseccomp2 -t buster-backports
Now on to the next build-time error message /p>
How do I change timezone in a docker container?
You can override as suggest by @LinPy during the run stage, but if you want to set at your Dockerfile you can set using ENV as tzdata is already there in your base image.
FROM postgres:10
ENV TZ="Africa/Lusaka"
RUN date
Build
docker build -t dbtest .
RUN
docker run -it dbtest -c "date"
Now you can verify on DB side by running
show timezone;
You will see Central Africa Time
in both container and Postgres
in the alpine base image, the environment variable will not work. You will need to run
RUN ls /usr/share/zoneinfo && \
cp /usr/share/zoneinfo/Europe/Brussels /etc/localtime && \
echo "Africa/Lusaka" > /etc/timezone && \
Related Topics
How to Stop 'Uninterruptible' Process on Linux
How to Run a Command as a Specific User in an Init Script
How to Prefill Command Line Input
Which Stack Is Used by Interrupt Handler - Linux
Run Docker in Ubuntu Live Disk
What Does "$" Give Us Exactly in a Shell Script
Why Doesn't This Call to 'Poll' Block Correctly on a Sysfs Device Attribute File
Linux Join Utility Complains About Input File Not Being Sorted
A Way to Determine a Process'S "Real" Memory Usage, I.E. Private Dirty Rss
Tail Inverse/Printing Everything Except the Last N Lines
How to Catch Duplicate Entries in Text File in Linux
Elf Program Header Virtual Address and File Offset
How to Run Linux Docker Images on Windows Server 2016
Poorly-Balanced Socket Accepts with Linux 3.2 Kernel VS 2.6 Kernel
Will Ctrl+C Send Sigint Signals to Both Parent and Child Processes in Linux
Installing Qt on Linux, Cannot Find -Lgl
System D-Bus Does Not Allow Punching Out Ownership with Conf Files