Di mana wadah Docker mendapatkan informasi waktunya? Saya telah membuat beberapa wadah dari ubuntu dasar: gambar tepercaya, dan ketika saya menjalankannya dan meminta 'tanggal', saya mendapatkan waktu UTC.
Untuk sementara saya menyelesaikan ini dengan melakukan hal berikut di Dockerfile saya:
RUN sudo echo "America/Los_Angeles" > /etc/timezone
Namun, untuk beberapa alasan yang berhenti bekerja. Pencarian online Saya melihat saran di bawah ini:
docker run -v /etc/timezone:/etc/timezone [image-name]
Kedua metode ini dengan benar mengatur zona waktu!
$ cat /etc/timezone
America/Los_Angeles
$ date
Tue Apr 14 23:46:51 UTC 2015
Adakah yang tahu apa yang terjadi?
Alpine
, Anda harus menginstaltzdata
terlebih dahulu, lihat di sini github.com/gliderlabs/docker-alpine/issues/136-v /etc/localtime:/etc/localtime:ro
(CentOS) semacam karya. Tanggal baris perintah di dalam kontainer mengembalikan tanggal dalam format zona waktu yang diharapkan. TETAPI jenkins berjalan dalam wadah menganggap zona waktu adalah UTC. Mengapa? / etc / localtime adalah symlink ke ../usr/share/zoneinfo/UTC dalam wadah bawaan. Konten file UTC dalam wadah sekarang menjadi zona waktu baru. Tapi jenkins (dan mungkin perangkat lunak berbasis java lainnya) menggunakan nama symlink yang masih "UTC". Mencari solusi. . .Jawaban:
Rahasianya di sini adalah bahwa
dpkg-reconfigure tzdata
cukup membuat/etc/localtime
sebagai salinan, hardlink atau symlink (sebuah symlink lebih disukai) ke file di/usr/share/zoneinfo
. Jadi dimungkinkan untuk melakukan ini sepenuhnya dari Dockerfile Anda. Mempertimbangkan:Dan sebagai bonus, TZ akan diatur dengan benar dalam wadah juga.
Ini juga agnostik distribusi, sehingga berfungsi dengan hampir semua Linux.
Catatan: jika Anda menggunakan gambar berbasis alpine, Anda harus menginstal yang
tzdata
pertama. (lihat masalah ini di sini )Terlihat seperti ini:
sumber
tzdata
menginstal paket untuk membuatnya berfungsi.TZ
variabel sudah cukup. Saya tidak perlu mengatur symlink atau yang lainnya.Biasanya cukup untuk menetapkan variabel lingkungan dalam wadah buruh pelabuhan, seperti:
Tentu saja ini akan berhasil juga
docker-compose
.sumber
ubuntu:16.04
, tidak memilikitzdata
paket yang harus ditambahkan di Dockerfile.Memasang
/etc/localtime
di gambar, sehingga sinkron denganhost -v
adalah yang paling populer.Tapi lihat masalah 12084 :
sumber
RUN echo "Europe/London" > /etc/timezone
Anda dapat menambahkan file lokal Anda (/ etc / zona waktu dan / etc / localtime) sebagai volume di docker-container Anda.
Perbarui Anda
docker-compose.yml
dengan baris berikut.Sekarang waktu penampungnya sama dengan tuan rumah Anda
sumber
echo "Europe/Paris" > /etc/timezone
sebelum memulai ulang wadah.Di ubuntu 16.04 gambar ada bug. Solusi tadinya
sumber
jika Anda menggunakan gambar buruh pelabuhan berdasarkan
ubuntu
:sumber
Terima kasih kepada VonC untuk informasi dan tautan ke masalah ini. Ini kelihatan seperti kekacauan yang berbelit-belit, jadi saya melakukan beberapa pengujian pada ide saya sendiri tentang bagaimana menyelesaikan ini dan tampaknya bekerja dengan baik.
(ikuti petunjuk untuk memilih zona waktu saya)
Kemudian saya memperbarui Dockerfiles saya untuk mencerminkan ini:
Pasti ada yang salah dengan ini karena sepertinya terlalu mudah untuk dilupakan ... Atau apakah ini dapat diterima?
sumber
exit
wadah. Ini di Debian.Menambahkan dua sen saya di sini, karena saya sudah mencoba beberapa di antaranya tetapi tidak ada yang bekerja pada gambar berbasis alpine.
Namun, ini berhasil:
[ Sumber ]
sumber
Cara yang lebih umum untuk menetapkan zona waktu dalam
docker run
argumen:Atau untuk digunakan kembali:
sumber