Où les conteneurs Docker obtiennent - ils leurs informations temporelles? J'ai créé des conteneurs à partir de l'image de base ubuntu:trusty, et lorsque je l'exécute et que je demande 'date', j'obtiens l'heure UTC.
Pendant un certain temps, j'ai contourné cela 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 les suggestions ci-dessous:
docker run -v /etc/timezone:/etc/timezone [image-name]
Cependant, ces deux méthodes définissent correctement le fuseau horaire!
$ cat /etc/timezoneAmerica/Los_Angeles$ dateTue Apr 14 23:46:51 UTC 2015
Le secret ici est que dpkg-reconfigure tzdata crée simplement /etc/localtime en tant que copie, lien dur ou lien symbolique (un lien symbolique est préféré) vers un fichier dans /usr/share/zoneinfo. Il est donc possible de le faire entièrement à partir de votre Dockerfile. Considérer:
ce n'est pas correct car cela ne fonctionne pas lorsque le logiciel nécessite à 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'existe en fait aucun 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:
# Set timezone as specified in /config/etc/timezonedpkg-reconfigure -f noninteractive tzdata
Volume de données /config dockerfile, localisé dans un pays ou une région spécifique:
# Set the time zoneRUN echo "Europe/London" > /config/etc/timezone
... ce n'est pas élégant car impliquant 3 fichiers séparés, et recréant /etc/localtime à chaque démarrage du conteneur d'exécution. Ce qui est plutôt inutile.
Cependant, il fonctionne correctement et réussit à séparer l'image de l'application de base de chaque configuration localisée par pays. En 3 lignes de code.
Merci à VonC pour les informations et le lien vers le numéro. Cela semble être un gâchis tellement compliqué, alors j'ai 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 cela:
FROM chocko/ubuntu:local
Il doit y avoir quelque chose qui ne va pas avec cela parce que cela semble trop facile à négliger... Ou est-ce acceptable?
Pour info . . . Je souhaite définir le fuseau horaire du conteneur au moment de l’exécution de docker et non au moment de la construction/du fichier docker. L’utilisation de - v / etc/localtime:/etc / localtime:ro (CentOS) fonctionne en quelque sorte. La ligne de commande date du conteneur renvoie la date au format de fuseau horaire attendu. MAIS jenkins fonctionnant dans un 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) utilisent le nom du lien symbolique qui est toujours “UTC”. À la recherche d’une solution . . .
Besoin de 2 choses, 1. lorsque le conteneur est créé, utilisez un script d’initialisation pour définir le lien symbolique /etc/localtime et /etc / timezone et 2. pour que le fuseau horaire jenkins soit extrait de deux options Java, ces options doivent être transmises au script d’initialisation qui démarre le processus jenkins. par exemple " - Dorg.Apache.commun.gelée.balise.fmt.Fuseau horaire = America / New_York-Duser.fuseau horaire = America / New_York". Toutes mes excuses, c’est spécifique à jenkins mais j’espère utile pour d’autres utilisateurs de jenkins.