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.

370voto

Michael Hampton Points 232226

Le secret ici est que dpkg-reconfigure tzdata crée simplement /etc/localtime comme une copie, un hardlink ou un symlink (un symlink est préférable) vers un fichier dans /usr/share/zoneinfo . Il est donc possible de le faire entièrement à partir de votre Dockerfile. Pensez-y :

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

Et en prime, le TZ sera également placé correctement dans le conteneur.

Il est également indépendant de la distribution, et fonctionne donc avec pratiquement tous les Linux.

Remarque : si vous utilisez une image basée sur le système alpin, vous devez installer l'option tzdata première. (voir ce numéro aquí )

Ça ressemble à ça :

RUN apk add --no-cache tzdata
ENV TZ America/Los_Angeles

119voto

Victor Klos Points 1251

Habituellement, il suffit de définir une variable d'environnement dans le conteneur docker, comme ceci :

docker run -e TZ=Europe/Amsterdam debian:jessie date

Bien sûr, cela fonctionnerait aussi avec docker-compose .

40voto

JohnK Points 13

Vous pouvez ajouter vos fichiers locaux (/etc/timezone et /etc/localtime) comme volume dans votre conteneur de docker.

Mettez à jour votre docker-compose.yml avec les lignes suivantes.

volumes:
    - "/etc/timezone:/etc/timezone:ro"
    - "/etc/localtime:/etc/localtime:ro"

Maintenant le temps de conteneur est le même que sur votre hôte

23voto

VonC Points 2643

Montage /etc/localtime dans l'image, afin qu'elle soit en phase avec host -v est le plus populaire.

Mais voyez numéro 12084 :

ce n'est pas correct car cela ne fonctionne pas lorsque le logiciel exige au contraire le fichier /etc/timezone à définir.
De cette façon, vous l'utilisez comme valeur par défaut. etc/UTC .

J'ai déterminé qu'il n'y a pas de moyen élégant et infaillible de définir le fuseau horaire à l'intérieur d'un conteneur docker.
J'ai donc finalement opté pour cette solution :

App dockerfile :

# Relocate the timezone file
RUN mkdir -p /config/etc && mv /etc/timezone /config/etc/ && ln -s /config/etc/timezone /etc/

Point d'entrée de l'application script :

# Set timezone as specified in /config/etc/timezone
dpkg-reconfigure -f noninteractive tzdata

Volume de données /config dockerfile, localisé dans un pays ou une région spécifique :

# Set the time zone
RUN echo "Europe/London" > /config/etc/timezone

... ce n'est pas élégant car cela implique 3 fichiers distincts, et la recréation de /etc/localtime à chaque démarrage du conteneur d'exécution. Ce qui est plutôt du gaspillage.

Cependant, il fonctionne correctement et permet de séparer l'image de l'application de base et la configuration localisée de chaque pays.
En 3 lignes de code.

18voto

Kiran Mohan Points 994

Dans l'image ubuntu 16.04 il y a un bug. La solution était

    ENV TZ 'Europe/Tallinn'
    RUN echo $TZ > /etc/timezone && \
    apt-get update && apt-get install -y tzdata && \
    rm /etc/localtime && \
    ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && \
    dpkg-reconfigure -f noninteractive tzdata && \
    apt-get clean

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