Como definir a hora do sistema dinamicamente em um contêiner do Docker

21

Existe alguma maneira de definir dinamicamente a hora do sistema de contêineres do Docker (em tempo de execução) sem afetar a máquina host?

Usando

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

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

Usando

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

apresenta o seguinte erro:

date: cannot set date: Operation not permitted

Caso de uso:

Eu preciso testar 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 2038
  • depuração de problemas relacionados a tempo, como certificados SSL expirados
  • executando o software que deixa de ser executado fora de um determinado período de tempo
  • processos de criação determinísticos.
por Vingtoft 06.01.2017 / 13:48

4 respostas

15

É possível

A solução é fingir no recipiente. Esta lib intercepta todos os programas de chamada 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.git
WORKDIR /libfaketime/src
RUN make install

Lembre-se de definir as variáveis de ambiente LD_PRELOAD antes de executar o aplicativo ao qual você quer 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 a hora do servidor:

Exemplo:

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())
    
por 09.01.2017 / 13:48
2

Jenny D está correta, pois, por padrão, o contêiner do Docker não permite acesso ao relógio do sistema.

No entanto, no Linux, se você estiver bem com seu contêiner tendo acesso a esse recurso, poderá permitir esse recurso usando a opção "--cap-add = SYS_TIME" do comando "docker run" ao criar seu contêiner:

# 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

Em seguida, você pode alterar o tempo dentro do contêiner em execução:

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

Documentação de referência: link

    
por 26.02.2018 / 05:18
0

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]
    
por 06.01.2017 / 13:57
0

solução docker-compose:

Adicione /etc/localtime:/etc/localtime:ro ao atributo volumes .

Veja este link para um exemplo.

    
por 21.08.2018 / 07:53

Tags