Есть ли способ установить системное время контейнеров 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]