Docker - Containers - Manipulating Time Inside a Docker Container

To run a Docker container with the time being different of the real time.

A solution is to use libfaketime.

You can use LD_PRELOAD to load libfaketime in ahead of the normal system libraries so that it can intercept date/time system calls and returns a time that is adjusted by your preferred offset.

This can be done with containers or normal processes.


FROM debian:10.5 as builder
 
RUN apt-get update && apt-get install -y make gcc git
 
# Get the sources and checkout at stable release 0.98
# see https://github.com/wolfcw/libfaketime/releases
RUN git clone https://github.com/wolfcw/libfaketime.git && \
    cd libfaketime && \
    git checkout ab1fc4eef31c7a64ce3a934588a1e67c41c8d256 && \
    make
 
FROM debian:10.5 as final
 
COPY --from=builder /libfaketime/src/libfaketime.so.1 /usr/local/lib
ENV LD_PRELOAD=/usr/local/lib/libfaketime.so.1
ENV FAKETIME="+2d"

Build it with:

sudo docker build --target final -t my/faketime .

NOTE: When a container is launched from this image it will appear to have a date/time exactly 2 days ahead of the real time as reflected by the host’s clock:

date
Thu Aug 27 12:08:38 UTC 2020
 
sudo docker run --rm -it my/faketime date
Thu Aug 29 12:08:45 UTC 2020

NOTE: A +2 day clock offset is baked into this image with an ENV directive.

You can also just specify FAKETIME when launching the container:

sudo docker run --rm -it --env FAKETIME=+9d my/faketime date
Sat Sep 05 12:08:57 UTC 2020

NOTE: libfaketime** also supports other options like setting the absolute time rather than specifying an offset.