Назад | Перейти на главную страницу

Как динамически установить системное время в контейнере Docker

Есть ли способ установить системное время контейнеров Docker динамически (во время выполнения), не влияя на хост-машину?

С помощью

hwclock --set --date "Sat Aug 17 08:31:24 PDT 2016"

дает следующую ошибку:

hwclock: Cannot access the Hardware Clock via any known method.
hwclock: Use the --debug option to see the details of our search for an access method.

С помощью

date -s "2 OCT 2006 18:00:00"

дает следующую ошибку:

date: cannot set date: Operation not permitted

Пример использования:

Мне нужно протестировать чувствительное ко времени программное обеспечение (поведение зависит от даты).

Другие распространенные варианты использования:

Это возможно

Решение - подделать его в контейнере. Эта библиотека перехватывает все программы системных вызовов, которые используются для получения текущего времени и даты.

Реализация проста. При необходимости добавьте функциональные возможности в свой Dockerfile:

WORKDIR /
RUN git clone https://github.com/wolfcw/libfaketime.git
WORKDIR /libfaketime/src
RUN make install

Не забудьте установить переменные среды LD_PRELOAD перед запуском приложения, к которому вы хотите применить фиктивное время.

Пример:

CMD ["/bin/sh", "-c", "LD_PRELOAD=/usr/local/lib/faketime/libfaketime.so.1 FAKETIME_NO_CACHE=1 python /srv/intercept/manage.py runserver 0.0.0.0:3000]

Теперь вы можете динамически изменять время серверов:

Пример:

import os
def set_time(request):
    print(datetime.today())
    os.environ["FAKETIME"] = "2020-01-01"  # Note: time of type string must be in the format "YYYY-MM-DD hh:mm:ss" or "+15d"
    print(datetime.today())

Дженни Д. права в том, что по умолчанию контейнер Docker не разрешает доступ к системным часам.

Однако в Linux, если вы в порядке с вашим контейнером, имеющим доступ к этой возможности, вы можете разрешить эту возможность, используя параметр «--cap-add = SYS_TIME» команды «docker run» при создании контейнера:

# docker run --cap-add=SYS_TIME -d --name teamcity-server-instance -v /opt/teamcity/data:/data/teamcity_server/datadir -v /opt/teamcity/logs:/opt/teamcity/logs -p 80:8111 jetbrains/teamcity-server

Затем вы можете изменить время внутри работающего контейнера:

# docker exec -it teamcity-server-instance /bin/bash
# date +%T -s "15:03:00"
15:03:00
#

Справочная документация: https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities

решение для создания докеров:

Добавить /etc/localtime:/etc/localtime:ro к volumes атрибут.

Посмотри на это ссылка на сайт для примера.

Запустите контейнер с дополнительной переменной окружения:

docker run -e "SET_CONTAINER_TIMEZONE=true" \
           -e "CONTAINER_TIMEZONE=US/Arizona" [docker image name]