Skylar
April 26, 2022, 7:13am
#1
Existe alguma maneira de definir um tempo do sistema de contêineres Docker dinamicamente (em tempo de execução) sem efetuar a máquina host?
Mear
hwclock --set --date "Sat Aug 17 08:31:24 PDT 2016"
dá o seguinte erro:
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.
Mear
date -s "2 OCT 2006 18:00:00"
dá o seguinte erro:
date: cannot set date: Operation not permitted
Uso:
Preciso testar o software sensível ao tempo (o comportamento depende da data).
Outros casos de uso comum:
executando software legado com erros y2k
software de teste para conformidade com o ano de 2038
problemas relacionados ao tempo de depuração, como certificados SSL expirados
software em execução que deixa de ser executado fora de um determinado período de tempo
processos de construção determinísticos.
Ali
April 26, 2022, 7:17am
#2
É possível
A solução é falsificá-lo no recipiente. Este lib intercepta todos os programas de chamadas do sistema usados para recuperar a hora e a data atuais.
A implementação é fácil. Adicione funcionalidade ao seu Dockerfile conforme apropriado:
WORKDIR /RUN git clone https://github.com/wolfcw/libfaketime.gitWORKDIR /libfaketime/srcRUN make install
Lembre-se de definir as variáveis de ambiente LD_PRELOAD
antes de executar o aplicativo, você deseja que o tempo falsificado seja aplicado.
Exemplo:
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]
Agora você pode alterar dinamicamente o tempo dos servidores:
Exemplo:
import osdef 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())
Aqui está docker-compose
solucao:
Adicionar /etc/localtime:/etc/localtime:ro
para o volumes
atributo.
Verificar link para obter um exemplo.
Inicie o contêiner com uma variável de ambiente adicional:
docker run -e "SET_CONTAINER_TIMEZONE=true" \ -e "CONTAINER_TIMEZONE=US/Arizona" [docker image name]
Na verdade, acabei de encontrar e testei positivamente uma solução usando o libfaketime
Vou atualizar com uma resposta + exemplo de trabalho em breve.
Quinn
April 26, 2022, 7:36am
#6
Qual seria o propósito de fazê-lo? Qual é o seu caso de uso?