Waktu & zona waktu kontainer Docker (tidak akan mencerminkan perubahan)

Dari mana kontainer Docker mendapatkan informasi waktu mereka? Saya telah membuat beberapa wadah dari ubuntu dasar: trusty image, dan ketika saya menjalankannya dan meminta 'Tanggal', saya mendapatkan waktu UTC.

Untuk sementara saya mengatasi ini dengan melakukan hal berikut di Dockerfile saya:

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

Namun, untuk beberapa alasan yang berhenti bekerja. Mencari online saya melihat di bawah ini disarankan:

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

Kedua metode ini mengatur zona waktu dengan benar!

$ cat /etc/timezoneAmerica/Los_Angeles$ dateTue Apr 14 23:46:51 UTC 2015

Ada yang tahu apa yang memberi?

Rahasianya di sini adalah bahwa dpkg-reconfigure tzdata cukup menciptakan /etc/localtime sebagai salinan, hardlink atau symlink (symlink lebih disukai) ke file di /usr/share/zoneinfo. Jadi dimungkinkan untuk melakukan ini sepenuhnya dari Dockerfile Anda. Pertimbangkan:

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

Dan sebagai bonus, TZ akan diatur dengan benar dalam wadah juga.

Ini juga distribusi-agnostik, sehingga bekerja dengan hampir semua Linux.

Catatan: Jika Anda menggunakan gambar berbasis alpine Anda harus menginstal tzdata pertama. (lihat masalah ini di sini)

Terlihat seperti ini:

RUN apk add --no-cache tzdataENV TZ America/Los_Angeles

Biasanya cukup untuk mengatur variabel lingkungan dalam wadah docker, seperti:

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

Tentu saja ini akan bekerja juga dengan docker-compose.

Anda dapat menambahkan file lokal anda (/etc /timezone dan/etc / localtime) sebagai volume di docker-container Anda.

Memperbarui Anda docker-compose.yml dengan baris berikut.

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

Sekarang waktu penampung sama dengan pada host Anda

Pemasangan /etc/localtime dalam gambar, sehingga sinkron dengan host -v adalah yang paling populer.

Tapi lihat edisi 12084:

hal ini tidak benar karena tidak bekerja ketika perangkat lunak membutuhkan bukan file /etc/timezone untuk diatur.
Dengan cara itu Anda menggunakan daun sebagai nilai default etc/UTC.

Saya telah menentukan bahwa sebenarnya tidak ada cara elegan yang sangat mudah untuk mengatur zona waktu di dalam wadah buruh pelabuhan.
Jadi akhirnya menetap di solusi ini:

App dockerfile:

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

App entrypoint script:

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

Volume Data /config dockerfile, dilokalkan ke negara atau wilayah tertentu:

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

... hal ini tidak elegan karena melibatkan 3 file terpisah, dan menciptakan kembali /etc/localtime pada setiap awal kontainer runtime. Yang agak boros.

Namun itu berfungsi dengan baik, dan berhasil mencapai pemisahan antara gambar aplikasi dasar, dan setiap konfigurasi lokal per negara.
Dalam 3 baris kode.

Di ubuntu 16.04 gambar ada bug. Solusi adalah

    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

Menambahkan dua sen saya di sini, karena saya sudah mencoba beberapa di antaranya tetapi tidak ada yang berhasil pada gambar berbasis alpine.

Namun, ini berhasil:

ENV TZ=America/TorontoRUN apk updateRUN apk upgradeRUN apk add ca-certificates && update-ca-certificatesRUN apk add --update tzdataRUN rm -rf /var/cache/apk/*

[Sumber]

Dalam gambar dasar alpine (contoh gunakan node:10.16.0-alpine):

Dockerfile

FROM node:10.16.0-alpineENV TZ=America/Los_AngelesRUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezoneWORKDIR /appCOPY package.json package-lock.json ./RUN npm i --productionCOPY . .CMD node index.js

Menggunakan wadah Fedora (kemungkinan juga berfungsi dengan ubuntu):

Solusi paling sederhana yang saya temukan adalah menggunakan yang berikut ini di docker-compose.yml

environment:   TZ: "${TZ:-America/Los_Angeles}"

Kemudian dalam Anda .file env (yang docker-compose secara otomatis membaca)

TZ=America/Los_Angeles

Ini memungkinkan Anda untuk menempatkan docker-compose.yml di bawah kontrol versi dan menggunakan disesuaikan .file env yang dapat diabaikan oleh git.

Anda mendapatkan nilai default untuk wadah dan Anda mendapatkan penyesuaian, terbaik dari kedua dunia.

Untuk Fedora tidak ada perubahan lain yang diperlukan, itu hanya berfungsi!

jika Anda menggunakan docker image berdasarkan ubuntu :

# Change the docker default timezone from UTC to SGTecho "Asia/Singapore" > /etc/timezonedpkg-reconfigure tzdatadate

Terima kasih kepada VonC untuk informasi dan link ke masalah ini. Ini sepertinya kekacauan yang berbelit-belit, jadi saya melakukan beberapa pengujian pada ide saya sendiri tentang bagaimana menyelesaikan ini dan tampaknya bekerja dengan baik.

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

(ikuti petunjuk untuk memilih zona waktu saya)

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

Kemudian saya memperbarui Dockerfiles saya untuk mencerminkan ini:

FROM chocko/ubuntu:local

Pasti ada yang salah dengan ini karena sepertinya terlalu mudah untuk diabaikan... Atau apakah ini dapat diterima?