
Docker: alterar data e hora sem interferir no host
Contents
Alterar a data e hora de um container docker sem interferir na data e hora do host.
Tentativas
Executando date -s
Ao tentar alterar a data pelo modo tradicional, obtemos um erro:
| |
Executando date -s em um container com --privileged
Subindo o container com --privileged, até conseguimos alterar, mas também altera no host (não queremos isso!):
| |
Executando date -s em um container com --cap-add=SYS_TIME
Iniciando o container com a opção --cap-add=SYS_TIME temos o mesmo problema comportamento acima.
Solução definitiva
Prover dentro da imagem a lib libfaketime. A forma mais recomenda é criar um Dockerfile para criar a imagem.
Abaixo um exemplo de Dockerfile usando o debian. Estaremos criando uma imagem a partir da imagem base do debian e adicionando apenas a capacidade de poder modificar a data e hora.
| |
📋 O
Dockerfileacima possui duas cláusulasFROM, mas apenas a última representa a imagem efetiva gerada ao final do comandodocker build. O nome desse recurso é multi-stage builds. É bastante útil quando na construção da imagem existem passos transientes, ex: precisamos apenas do binário, mas não precisamos de toda a stack de build que é necessário para criar o binário.📋 O primeiro
FROMcria uma imagem temporária com a liblibfaketimecompilada (o binário). O segundoFROM(e definitivo) vai copiar apenas a lib para a imagem definitiva.
Para testar basta construir a imagem:
| |
📋 A única diferença da imagem resultante para a imagem original do
debian, são dois arquivos novos. Podemos checar facilmente com o dive, executando:dive faketime-debian. Essa é uma boa notícia, pois a imagem original praticamente não muda!
Em seguida iniciar um container informando os parâmetros de data:
A data exibida no console deve ser 15 dias no futuro.
Observar os parâmetros FAKETIME, LD_PRELOAD e DONT_FAKE_MONOTONIC. Mais opções podem ser consultadas na página do projeto libfaketime.
Como usar isso na prática
É comum termos uma imagem e precisarmos desse recurso (ou não, 😃), então dado o exemplo acima, o segundo FROM deve ser o FROM que você tem na sua imagem atual.
Dockerfiles para algumas distros
É recomendado compilar (buildar) o libfaketime de acordo com a distribuição da sua imagem. Segue abaixo três Dockerfiles para debian, alpine e fedora. No ponto de você trocar o segundo FROM para o seu caso.
- [debian]({{ site.baseurl }}/assets/outros/docker-change-internal-date-time/Dockerfile.debian)
- [alpine]({{ site.baseurl }}/assets/outros/docker-change-internal-date-time/Dockerfile.alpine)
- [fedora]({{ site.baseurl }}/assets/outros/docker-change-internal-date-time/Dockerfile.fedora)
MhagnumDw



