web-dev-qa-db-fra.com

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

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

Pendant un certain temps, j'ai contourné cela en procédant comme suit dans mon Dockerfile:

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

Cependant, pour une raison quelconque, cela a cessé de fonctionner. Recherche en ligne, j'ai vu ce qui suit suggéré:

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

Cependant, ces deux méthodes définissent correctement le fuseau horaire!

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

Quelqu'un sait ce qui donne?

159
Chockomonkey

Le secret ici est que dpkg-reconfigure tzdata crée simplement /etc/localtime en tant que copie, lien physique ou lien symbolique (un lien symbolique est préférable) vers un fichier dans /usr/share/zoneinfo. Il est donc possible de le faire entièrement à partir de votre Dockerfile. Considérer:

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

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

C'est également indépendant de la distribution, donc cela fonctionne avec à peu près n'importe quel Linux.

Remarque: si vous utilisez une image alpine, vous devez d'abord installer le tzdata. (voir ce numéro ici )

Ressemble à ça:

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

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 également avec docker-compose.

68
Victor Klos

Vous pouvez ajouter vos fichiers locaux (/ etc/timezone et/etc/localtime) en tant que volume dans votre docker-container.

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

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

Maintenant, l'heure du conteneur est la même que sur votre hôte

23
thhan

Montage /etc/localtime dans l'image, il est donc synchronisé avec Host -v est le plus populaire.

Mais voir problème 12084 :

il n'est pas correct car il ne fonctionne pas lorsque le logiciel requiert à la place le fichier /etc/timezone à régler.
De cette façon, vous l'utilisez comme valeur par défaut etc/UTC.

J'ai déterminé qu'il n'y a en fait aucun moyen élégant et infaillible de définir le fuseau horaire à l'intérieur d'un conteneur Docker.
Nous avons donc finalement décidé de cette solution:

Dockerfile d'application:

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

Script de point d'entrée de l'application:

# 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 impliquant 3 fichiers distincts, et recréant /etc/localtime à chaque démarrage du conteneur d'exécution. Ce qui est plutôt inutile.

Cependant, cela fonctionne correctement et réussit à séparer l'image de l'application de base et chaque configuration localisée par pays.
En 3 lignes de code.

22
VonC

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
12
qwerty

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
4
Xianlin

J'ajoute mes deux cents ici, car j'ai essayé plusieurs d'entre eux, mais aucun n'a fonctionné sur des images alpines.

Cependant, cela 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 ]

4
Alpha

Merci à VonC pour les informations et le lien vers le problème. Cela semble être un gâchis si compliqué, j'ai donc fait des tests sur ma propre idée de la façon de résoudre ce problème et cela semble très bien fonctionner.

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

(suivez les invites pour sélectionner mon fuseau horaire)

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

Ensuite, j'ai mis à jour mes Dockerfiles pour refléter ceci:

FROM chocko/ubuntu:local

Il doit y avoir quelque chose qui ne va pas parce que cela semble trop facile à ignorer ... Ou est-ce acceptable?

3
Chockomonkey

Une façon plus générique de définir le fuseau horaire dans docker run arguments:

-e TZ=`ls -la /etc/localtime | cut -d/ -f8-9`

Ou pour réutilisation:

function GET_TZ () {
    ls -la /etc/localtime | cut -d/ -f8-9
}

...
-e TZ=`GET_TZ`
1
Mugen