GNU/Linux >> Belajar Linux >  >> Panels >> Docker

Cara Menangani Zona Waktu di Docker Containers

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.


Docker
  1. Cara Memperbarui Wadah Docker yang Berjalan Secara Otomatis

  2. Cara Mendaftar Kontainer Docker

  3. Bagaimana cara menangani pembaruan keamanan dalam wadah Docker?

  1. Cara Mengekspor dan Mengimpor Kontainer Docker

  2. Cara Menggunakan Tulis Docker

  3. Bagaimana Menghubungkan Kontainer Docker

  1. Bagaimana Mengelola Kontainer Docker? Praktik terbaik

  2. Bagaimana Melewati Variabel Lingkungan ke Docker Containers

  3. Cara menghapus semua wadah Docker