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?
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
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
.
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
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éfautetc/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.
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
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
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 ]
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?
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`