J'ai créé un conteneur Docker à l'aide de l'image Ubuntu 16.04.
docker run -it -d --name containername -v /var/www/public --privileged ubuntu
après avoir créé le conteneur, j'ai vérifié la date à l'intérieur du conteneur:
$ date
Tue Oct 25 08:10:34 UTC 2016
Mais, j'en ai besoin pour utiliser le Asia/Kolkata timezone. J'ai donc essayé de modifier le fichier /etc/timezone
, puis docker stop
et docker start
le conteneur, mais cela ne fonctionne pas. Il montre toujours le même temps.
Comment modifier le fuseau horaire dans le conteneur Docker après l'avoir créé?
La mise à jour de /etc/timezone
est la méthode habituelle, mais il existe un bogue dans Xenial qui signifie que cela ne fonctionne pas.
Au lieu de cela, vous devez créer un lien depuis le fuseau horaire souhaité vers etc/localtime
:
FROM ubuntu:xenial
RUN ln -fs /usr/share/zoneinfo/US/Pacific-New /etc/localtime && dpkg-reconfigure -f noninteractive tzdata
Dans Ubuntu 16.04, il me manquait tzdata alors je devais l'installer. La solution de travail é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
Essayer:
echo "Asia/Kolkata" > /etc/timezone
rm -f /etc/localtime
dpkg-reconfigure -f noninteractive tzdata
Vous devez faire rm /etc/localtime
à cause du bug Ubuntu .
Comme dit ici , le secret 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) à un fichier en /usr/share/zoneinfo
. Il est donc possible de le faire entièrement à partir de votre fichier Docker. 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 défini dans le conteneur.
Ceci est également indépendant de la distribution, donc cela fonctionne avec à peu près n'importe quoi sous Linux.
Résolu:
FROM ubuntu:16.04
RUN apt-get update && \
apt-get install -y software-properties-common apt-utils locales tzdata
RUN echo "tzdata tzdata/Areas select Europe" > timezone.txt
RUN echo "tzdata tzdata/Zones/Europe select Rome" >> timezone.txt
RUN debconf-set-selections timezone.txt
RUN rm /etc/timezone
RUN rm /etc/localtime
RUN dpkg-reconfigure -f noninteractive tzdata
Si vous utilisez docker-compos, ajoutez simplement une ligne à votre fichier docker-compose.yml
.
version: '3'
services:
ubuntu-local:
image: ubuntu:16.04
restart: on-failure
command: python3 run_my_code.py
working_dir: /code
volumes:
- ./code:/code
- /etc/localtime:/etc/localtime:ro # <--add this line to set timezone
environment:
- PYTHONUNBUFFERED=1
Mon problème a été résolu avec cette solution très simple ( https://serverfault.com/a/826222 ): Ajouter un fuseau horaire dans la variable d'environnement.
La commande est docker run -e TZ=Europe/Amsterdam ...
Ou, en utilisant docker-compose, comme je le fais:
version: '3'
services:
web:
build: ./app
ports:
- ...
volumes:
- ...
environment:
- TZ=Europe/Paris
Dans mon cas, plus besoin de tzdata, ni de partage de volume avec/etc/timezone &/etc/localtime.
J'espère que ça aide !
J'ai pris cette approche:
Copiez le fichier/etc/localtime quelque part.
-3 correspond à l'heure de Moscou. Pour Berlin set -1. Si vous avez besoin d'une valeur positive, définissez UTC2
Copiez et modifiez/etc/timezone en fonction de votre fuseau horaire.
Résultat: