Есть ли способ установить системное время 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
Случай использования:
Мне нужно протестировать чувствительное ко времени программное обеспечение (поведение зависит от даты).
Другие распространенные случаи использования:
- запуск устаревшего программного обеспечения с ошибками y2k
- тестирование программного обеспечения на соответствие требованиям 2038 года
- отладка связанных со временем проблем, таких как истекшие сертификаты SSL
- запуск программного обеспечения, которое перестает работать вне определенного периода времени
- детерминированные процессы сборки.
Ответы:
Возможно
Решение состоит в том, чтобы подделать его в контейнере. Эта библиотека перехватывает все программы системных вызовов, используемые для получения текущего времени и даты.
Реализация проста. Добавьте функциональность в ваш Dockerfile соответствующим образом:
Не забудьте установить переменные среды,
LD_PRELOAD
прежде чем запускать приложение, к которому вы хотите применить фиктивное время.Пример:
Теперь вы можете динамически изменять время сервера:
Пример:
источник
Jenny D прав в том, что по умолчанию контейнер Docker не разрешает доступ к системным часам.
Однако в Linux, если у вас все в порядке с вашим контейнером, имеющим доступ к этой возможности, вы можете разрешить эту возможность, используя опцию «--cap-add = SYS_TIME» команды «docker run» при создании вашего контейнера:
Затем вы можете изменить время внутри запущенного контейнера:
Справочная документация: https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities
источник
Запустите контейнер с дополнительной переменной среды:
источник
docker-compose решение:
Добавьте
/etc/localtime:/etc/localtime:ro
кvolumes
атрибуту.Посмотрите на эту ссылку для примера.
источник