263 votes

Heure et fuseau horaire du conteneur Docker (ne reflètera pas les changements)

Où les conteneurs Docker obtiennent-ils leurs informations temporelles ? J'ai créé quelques conteneurs à partir de l'image de base ubuntu:trusty, et lorsque je l'exécute et demande 'date', j'obtiens l'heure UTC.

Pendant un certain temps, j'ai contourné ce problème en faisant ce qui suit dans mon Dockerfile :

RUN sudo echo "America/Los_Angeles" > /etc/timezone

Cependant, pour une raison quelconque, cela a cessé de fonctionner. En cherchant en ligne, j'ai vu la proposition ci-dessous :

docker run -v /etc/timezone:/etc/timezone [image-name]

Ces deux méthodes permettent cependant de définir correctement le fuseau horaire !

$ cat /etc/timezone
America/Los_Angeles
$ date
Tue Apr 14 23:46:51 UTC 2015

Quelqu'un sait ce qui se passe ?

5 votes

Si vous utilisez Alpine vous devez installer tzdata d'abord, voir ici github.com/gliderlabs/docker-alpine/issues/136

2 votes

POUR VOTRE INFORMATION Je souhaite définir le fuseau horaire du conteneur au moment de l'exécution de docker et non au moment de la construction de docker/dockerfile. En utilisant -v /etc/localtime:/etc/localtime:ro (CentOS) fonctionne en quelque sorte. Dans le conteneur, la ligne de commande date renvoie la date dans le format de fuseau horaire attendu. MAIS Jenkins, qui fonctionne dans le conteneur, pense que le fuseau horaire est UTC. Pourquoi ? /etc/localtime est un lien symbolique vers ../usr/share/zoneinfo/UTC dans le conteneur construit. Le contenu du fichier UTC dans le conteneur est maintenant le nouveau fuseau horaire. Mais jenkins (et peut-être d'autres logiciels basés sur Java) utilise le nom du lien symbolique qui est toujours "UTC". Je cherche une solution

1 votes

Besoin de 2 choses, 1. Lorsque le conteneur est créé, utiliser un init script pour définir le lien symbolique /etc/localtime et /etc/timezone et 2. pour jenkins le fuseau horaire est pris à partir de deux options java, ces options doivent être passées au init script qui démarre le processus jenkins. par exemple " -Dorg.apache.commons.jelly.tags.fmt.timeZone=America/New_York -Duser.timezone=America/New_York ". Toutes mes excuses, ceci est spécifique à Jenkins mais j'espère que cela sera utile pour d'autres utilisateurs de Jenkins.

6voto

Xianlin Points 615

Si vous utilisez une image docker basée sur ubuntu :

# Change the docker default timezone from UTC to SGT
echo "Asia/Singapore" > /etc/timezone
dpkg-reconfigure tzdata
date

5voto

Alex Balashov Points 1151

J'ajoute mon grain de sel ici, car j'en ai essayé plusieurs, mais aucun n'a fonctionné sur les images alpines.

Cependant, ceci a fait l'affaire :

ENV TZ=America/Toronto
RUN apk update
RUN apk upgrade
RUN apk add ca-certificates && update-ca-certificates
RUN apk add --update tzdata
RUN rm -rf /var/cache/apk/*

[ Source : ]

4voto

Dans l'image de base alpine (exemple : node:10.16.0-alpine) :

Dockerfile

FROM node:10.16.0-alpine

ENV TZ=America/Los_Angeles

RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

WORKDIR /app

COPY package.json package-lock.json ./

RUN npm i --production

COPY . .

CMD node index.js

4voto

Utilisation d'un conteneur Fedora (susceptible de fonctionner avec ubuntu également) :

La solution la plus simple que j'ai trouvée a été d'utiliser ce qui suit dans docker-compose.yml

environment: 
  TZ: "${TZ:-America/Los_Angeles}"

Puis dans votre fichier .env (que docker-compose lit automatiquement)

TZ=America/Los_Angeles

Cela vous permet de placer docker-compose.yml sous contrôle de version et d'utiliser un fichier .env personnalisé qui peut être ignoré par git.

Vous obtenez une valeur par défaut pour le conteneur et vous obtenez la personnalisation, le meilleur des deux mondes.

Pour Fedora, aucun autre changement n'a été nécessaire, cela fonctionne tout simplement !

3voto

Chockomonkey Points 2543

Merci à VonC pour l'information et le lien vers le numéro. J'ai donc testé ma propre idée pour résoudre ce problème et cela semble fonctionner parfaitement.

>docker run -it ubuntu:trusty /bin/bash
#dpkg-reconfigure tzdata

(suivre les instructions pour sélectionner mon fuseau horaire)

>docker commit [container-id] chocko/ubuntu:local

Puis j'ai mis à jour mes Dockerfiles pour refléter cela :

FROM chocko/ubuntu:local

Il doit y avoir quelque chose qui cloche car cela semble trop facile pour être négligé... Ou est-ce acceptable ?

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X