Zona waktu adalah sumber kebingungan yang umum saat menyimpan aplikasi. Apakah tugas cron Anda akan berjalan pada waktu yang tepat? Container Docker tidak mewarisi zona waktu host, sehingga Anda dapat mengalami masalah penjadwalan tak terduga yang merusak aplikasi Anda.
Ini date
perintah yang berjalan secara asli pada host Ubuntu 20.04 di zona waktu Waktu Musim Panas Inggris:
Dan inilah perintah yang sama dalam wadah berdasarkan ubuntu:20.04
yang tidak dimodifikasi gambar:
Penampung menggunakan zona waktu UTC, membuat perbedaan satu jam antara dua waktu tersebut.
Bagaimana Zona Waktu Linux Bekerja?
Sebagian besar distribusi Linux menggunakan tzdata
paket untuk memberikan informasi zona waktu. Ketika tzdata
diinstal, Anda dapat memeriksa zona waktu saat ini dengan membaca /etc/timezone
berkas:
Anda juga akan memiliki /etc/localtime
mengajukan. Ini adalah symlink ke database zona waktu yang benar untuk lokasi yang dipilih:
Jika Anda mengubah zona waktu, gunakan dpkg-reconfigure tzdata
, /etc/localtime
symlink diperbarui untuk menunjuk ke database baru. Output dari perintah seperti date
akan disesuaikan untuk menyertakan offset zona waktu aktif.
Masalah Dengan Kontainer
Tantangan dengan wadah berasal dari pengaturan zona waktu di tempat pertama. Jika Anda memikirkan kembali saat Anda mengatur host Anda, Anda harus mengatur zona waktu sebagai bagian dari instalasi sistem operasi. Ketika Anda menjalankan wadah baru, itu segera dimulai, tanpa tahap "instalasi". Tidak ada kesempatan untuk memilih zona waktu yang sesuai.
Secara teoritis, runtime container dapat menawarkan pewarisan otomatis zona waktu host. Ini tidak terjadi karena dapat menyebabkan hasil yang tidak terduga saat menerapkan ke lingkungan jarak jauh. Akan mudah untuk mengabaikan bahwa jadwal cron Anda berfungsi di mesin lokal Anda, tetapi dijalankan secara tidak terduga di kluster Kubernetes terkelola menggunakan waktu UTC.
Gambar kontainer dikirimkan dengan zona waktu yang sudah matang sebagai gantinya. Untuk gambar paling populer, ini akan menjadi UTC. Banyak gambar dasar, terutama yang minimal, bahkan tidak menyertakan tzdata
kemasan. Anda tidak akan memiliki /etc/timezone
atau /etc/localtime
file.
Menambahkan Zona Waktu ke Kontainer Anda
Bagian pertama dari pengaturan zona waktu yang tepat adalah memastikan tzdata
dipasang. Jika gambar Anda tidak menyertakannya, Anda harus menambahkan paket secara manual sebagai bagian dari Dockerfile
Anda .
FROM ubuntu:latest ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && apt-get install -y tzdata
Ketika tzdata
menginstal, Anda biasanya mendapatkan prompt interaktif yang memungkinkan Anda memilih zona waktu yang benar dari menu. Ini tidak membantu saat Anda membuat container Docker secara terprogram. Menyetel DEBIAN_FRONTEND
variabel lingkungan menekan prompt dan default zona waktu ke UTC.
Setelah Anda mendapatkan tzdata
ke dalam gambar Anda, Anda siap untuk mengonfigurasi zona waktu yang tepat untuk aplikasi Anda. Pendekatan paling sederhana adalah dengan mengatur TZ
variabel lingkungan ke zona waktu yang ingin Anda gunakan:
FROM ubuntu:latest ENV TZ=Europe/London ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && apt-get install -y tzdata
Jika mau, Anda dapat mengatur TZ
variabel saat Anda memulai container. Berikan sebagai variabel lingkungan ke docker run
. Ini memungkinkan Anda mengganti zona waktu default gambar, asalkan menyertakan tzdata
paket.
docker run -e TZ=Europe/London -it ubuntu:latest
Alternatif untuk variabel lingkungan adalah /etc/timezone
mengajukan. Anda dapat menulis zona waktu yang diperlukan sebagai bagian dari Dockerfile
. Anda . Jika Anda menggunakan metode ini, Anda harus mengkonfigurasi ulang tzdata
menggunakan manajer paket Anda. Ingatlah untuk menggunakan mode non-interaktif atau Anda akan menerima permintaan zona waktu grafis lagi.
FROM ubuntu:latest RUN echo "Europe/London" > /etc/timezone RUN dpkg-reconfigure -f noninteractive tzdata
Teknik Lainnya
Jika Anda ingin menjamin sinkronisasi zona waktu dengan host, Anda dapat memasang tzdata
local lokal Anda file ke dalam wadah Anda. Anda masih memerlukan tzdata
di dalam wadah agar ini berfungsi dengan benar.
docker run -v /etc/timezone:/etc/timezone -v /etc/localtime:/etc/localtime -it ubuntu:latest
Meskipun Docker tidak menyediakan dukungan bawaan untuk zona waktu, itu tidak berlaku untuk semua mesin kontainer. Podman memiliki --tz
dedicated khusus flag yang memungkinkan Anda mengatur zona waktu saat membuat wadah baru:
podman run --tz=Europe/London -it ubuntu:latest
Di balik layar, Podman akan memasang /etc/localtime
. yang sesuai berkas untuk Anda. Zona waktu yang ditentukan akan bertahan selama masa pakai penampung.
Podman juga memungkinkan Anda menyetel zona waktu default untuk container yang dibuat tanpa --tz
bendera. Buat atau edit .config/containers/containers.conf
di direktori home Anda. Tambahkan tz
pengaturan pada baris baru dalam file:
# Used when no --tz flag is given tz = "Europe/London"
Integrasi zona waktu asli Podman membuatnya lebih mudah digunakan daripada Docker. Karena CLI Podman kompatibel dengan Docker, peralihan ini layak dipertimbangkan jika Anda sering bekerja dengan container di zona waktu yang berbeda.
Ringkasan
Zona waktu sering diabaikan saat menyiapkan wadah Docker. Sebagian besar gambar dasar default ke waktu UTC yang dapat menyebabkan kebingungan ketika zona waktu host berbeda.
Dengan menginstal tzdata
paket, wadah Anda mendapatkan kompatibilitas dengan semua zona waktu melalui TZ
variabel lingkungan, /etc/timezone
, dan /etc/localtime
. Atau, Anda dapat menyinkronkan zona waktu host Anda dengan memasang file yang relevan ke dalam wadah Anda.
Terakhir, ingat bahwa pertimbangan ini juga berlaku untuk layanan Docker yang dihosting dan cluster Kubernetes. Wadah Anda akan menggunakan waktu UTC kecuali diinstruksikan sebaliknya. Selama Anda dapat mengatur variabel lingkungan, Anda akan dapat menggunakan TZ
untuk menyesuaikan zona waktu untuk beban kerja Anda.