Como definir o tempo do sistema dinamicamente em um contêiner Docker

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.

É 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.

Qual seria o propósito de fazê-lo? Qual é o seu caso de uso?

Por favor, veja editar.