Onde os contêineres Docker obtêm suas informações de tempo? Criei alguns contêineres a partir da imagem básica do ubuntu: trusty e, quando o executo e solicito 'data', recebo a hora UTC.
Por algum tempo, contornei isso fazendo o seguinte no meu Dockerfile:
RUN sudo echo "America/Los_Angeles" > /etc/timezone
No entanto, por algum motivo, isso parou de funcionar. Pesquisando on-line eu vi o abaixo sugerido:
docker run -v /etc/timezone:/etc/timezone [image-name]
Ambos os métodos definem corretamente o fuso horário!
$ cat /etc/timezoneAmerica/Los_Angeles$ dateTue Apr 14 23:46:51 UTC 2015
O segredo aqui é que dpkg-reconfigure tzdata criar /etc/localtime como uma cópia, hardlink ou link simbólico (um link simbólico é preferido) para um arquivo em /usr/share/zoneinfo. Portanto, é possível fazer isso inteiramente do seu Dockerfile. Considerar:
não está correto porque não funciona quando o software requer o arquivo /etc/timezone para ser definido. Dessa forma, você está usando leaves it como o valor padrão etc/UTC.
Eu determinei que, na verdade, não há uma maneira elegante e infalível de definir o fuso horário dentro de um contêiner docker. Então, finalmente se estabeleceram nesta solução:
# Set timezone as specified in /config/etc/timezonedpkg-reconfigure -f noninteractive tzdata
Volume de dados /config dockerfile, localizado em um país ou região específica:
# Set the time zoneRUN echo "Europe/London" > /config/etc/timezone
... não é elegante porque envolve 3 arquivos separados e recriação /etc/localtime em cada início do contêiner de tempo de execução. O que é um desperdício.
No entanto, ele funciona corretamente e consegue com sucesso a separação entre a imagem do aplicativo base e cada configuração localizada por país. Em 3 linhas de código.
Obrigado ao VonC pela informação e link para o problema. Isso parece uma bagunça tão complicada, então fiz alguns testes com minha própria ideia de como resolver isso e parece funcionar muito bem.
>docker run -it ubuntu:trusty /bin/bash#dpkg-reconfigure tzdata
(siga as instruções para selecionar meu fuso horário)
>docker commit [container-id] chocko/ubuntu:local
Então eu atualizei meus Dockerfiles para refletir isso:
FROM chocko/ubuntu:local
Deve haver algo errado com isso, porque parece muito fácil de ser esquecido... Ou isso é aceitável?
Para sua informação . . . Desejo definir o fuso horário do contêiner no tempo de execução do docker, não no tempo de compilação/dockerfile do docker. Usando` - V /etc/localtime:/etc/localtime:ro ’ (CentOS) tipo de trabalho. Dentro do contêiner, a data da linha de comando retorna a data no formato de fuso horário esperado. Mas jenkins em execução no contêiner acha que o fuso horário é UTC. Por quê? /etc / localtime é um link simbólico para …/usr/share/zoneinfo / UTC no recipiente construído. O conteúdo do arquivo UTC no contêiner agora é o novo fuso horário. Mas jenkins (e talvez outro software baseado em java) usa o nome do link simbólico que ainda é “UTC”. Procurando solução . . .
Precisa de 2 coisas, 1. quando o contêiner é criado, use um script init para definir o link simbólico /etc/localtime e/etc / Fuso horário e 2. para que o fuso horário jenkins seja retirado de duas opções java, essas opções precisam ser passadas para o script init que inicia o processo jenkins. por exemplo. " - Dorg.Apache.comuns.geleia.etiqueta.fmt.fuso horário = America / New_York-Douser.Fuso horário = America / New_York ". Desculpas, isso é específico do jenkins, mas espero que seja útil para alguns outros usuários do jenkins.