Header Ads

Como lidar com fusos horários em contêineres Docker

Os fusos horários são uma fonte comum de confusão ao colocar um aplicativo em contêiner. Suas tarefas cron serão executadas no momento certo? Os contêineres do Docker não herdam o fuso horário do host, portanto, você pode ter problemas de agendamento inesperados que podem causar estragos em seu aplicativo.

Aqui está o comando date em execução nativa em um host Ubuntu 20.04 no fuso horário do horário de verão britânico:

E aqui está o mesmo comando em um contêiner baseado em uma imagem ubuntu: 20.04 não modificada:

O contêiner está usando o fuso horário UTC, criando uma diferença de uma hora entre os dois horários.

Como funcionam os fusos horários do Linux?

A maioria das distribuições Linux usa o pacote tzdata para fornecer informações de fuso horário. Quando o tzdata é instalado, você pode inspecionar o fuso horário atual lendo o arquivo / etc / timezone:

Publicidade

Você também terá um arquivo / etc / localtime. Este é um link simbólico para o banco de dados de fuso horário correto para o local selecionado:

Se você alterar o fuso horário, usando dpkg-reconfigure tzdata, o link simbólico / etc / localtime é atualizado para apontar para o novo banco de dados. A saída de comandos como data será ajustada para incluir o deslocamento do fuso horário ativo ’.

O problema com contêineres

O desafio com os contêineres deriva da definição do fuso horário em primeiro lugar. Se você se lembrar de quando configurou seu host, você &’ teria que definir o fuso horário como parte da instalação do sistema operacional. Quando você executa um novo contêiner, ele é iniciado imediatamente, sem qualquer “ instalação ” etapa. Não há oportunidade de selecionar um fuso horário apropriado.

Teoricamente, os tempos de execução do contêiner podem oferecer herança automática do fuso horário do host. Isso não acontece porque pode levar a resultados inesperados ao implantar em ambientes remotos. Seria fácil ignorar que sua programação cron funciona em sua máquina local, mas é executada de forma inesperada em um cluster Kubernetes gerenciado usando o horário UTC.

As imagens do contêiner são enviadas com um fuso horário integrado. Para as imagens mais populares, será UTC. Muitas imagens básicas, particularmente as mínimas, nem mesmo incluem o pacote tzdata. Você não terá arquivos / etc / timezone ou / etc / localtime.

Adicionando fusos horários aos seus contêineres

A primeira parte da configuração do fuso horário adequado é ter certeza de que o tzdata está instalado. Se a sua imagem não o incluir, você precisará adicionar manualmente o pacote como parte do seu Dockerfile.

 DO ubuntu: último ENV DEBIAN_FRONTEND = não interativo RUN apt-get update & & apt-get install -y tzdata 

Publicidade

Quando o tzdata é instalado, você geralmente obtém um prompt interativo que permite selecionar o fuso horário correto em um menu. Isso é inútil quando você está criando contêineres do Docker de maneira programática. Definir a variável de ambiente DEBIAN_FRONTEND suprime o prompt e padroniza o fuso horário para UTC.

Depois de inserir o tzdata em sua imagem, você estará pronto para configurar o fuso horário correto para o seu aplicativo. A abordagem mais simples é definir a variável de ambiente TZ para o fuso horário que você deseja usar:

 DO ubuntu: último ENV TZ = Europa / Londres ENV DEBIAN_FRONTEND = RUN não interativo apt-get update & & apt-get install -y tzdata 

Se preferir, você pode definir a variável TZ ao iniciar os contêineres. Passe-o como uma variável de ambiente para a execução do docker. Isso permite que você substitua o fuso horário padrão de uma imagem, desde que inclua o pacote tzdata.

 docker run -e TZ = Europa / Londres -it ubuntu: mais recente 

Uma alternativa às variáveis ​​de ambiente é o arquivo / etc / timezone. Você pode escrever o fuso horário necessário como parte do seu Dockerfile. Se você usar este método, deverá reconfigurar tzdata usando seu gerenciador de pacotes. Lembre-se de usar o modo não interativo ou você receberá o prompt gráfico de fuso horário novamente.

 DO ubuntu: RUN echo "Europe / London" > / etc / timezone RUN dpkg-reconfigure -f tzdata não interativo 

Outras técnicas

Se você deseja garantir a sincronização de fuso horário com o host, você pode montar seus arquivos tzdata locais em seus contêineres. Você ainda precisará do tzdata dentro do contêiner para que isso funcione corretamente.

 docker run -v / etc / timezone: / etc / timezone -v / etc / localtime: / etc / localtime -it ubuntu: mais recente 

Embora o Docker não forneça nenhum suporte integrado para fusos horários, isso não é verdade para todos os mecanismos de contêiner. O Podman tem um sinalizador --tz dedicado que permite definir o fuso horário ao criar um novo contêiner:

 podman run --tz = Europa / Londres -it ubuntu: mais recente 

Publicidade

Nos bastidores, o Podman montará um arquivo / etc / localtime apropriado para você. O fuso horário especificado persistirá durante a vida útil do contêiner.

O Podman também permite definir um fuso horário padrão para containers criados sem o sinalizador --tz. Crie ou edite . config / containers / containers. conf em seu diretório inicial. Adicione uma configuração tz em uma nova linha no arquivo:

 # Usado quando nenhuma bandeira --tz é fornecida tz = "Europa / Londres" 

A integração de fuso horário nativa do Podman torna-o mais fácil de trabalhar do que o Docker. Como a CLI do Podman é compatível com os Docker, vale a pena considerar fazer a troca se você trabalhar frequentemente com contêineres em fusos horários diferentes.

Resumo

Os fusos horários costumam ser esquecidos ao configurar contêineres do Docker. A maioria das imagens de base usa como padrão o horário UTC, o que pode causar confusão quando o fuso horário do host é diferente.

Ao instalar o pacote tzdata, seu contêiner ganha compatibilidade com todos os fusos horários por meio da variável de ambiente TZ, / etc / timezone e / etc / localtime. Como alternativa, você pode sincronizar o fuso horário do seu host montando os arquivos relevantes em seus contêineres.

Finalmente, lembre-se de que essas considerações também se aplicam a serviços Docker hospedados e clusters Kubernetes. Seus contêineres usarão o horário UTC, a menos que haja instruções em contrário. Contanto que você possa definir variáveis ​​de ambiente, você poderá usar o TZ para ajustar o fuso horário para suas cargas de trabalho.

Nenhum comentário