Skylar
April 27, 2022, 11:27pm
#1
Apakah ada cara untuk mengatur waktu sistem kontainer Docker secara dinamis (pada waktu berjalan) tanpa mempengaruhi mesin host?
Menggunakan
hwclock --set --date "Sat Aug 17 08:31:24 PDT 2016"
memberikan kesalahan berikut:
hwclock: Cannot access the Hardware Clock via any known method.hwclock: Use the --debug option to see the details of our search for an access method.
Menggunakan
date -s "2 OCT 2006 18:00:00"
memberikan kesalahan berikut:
date: cannot set date: Operation not permitted
Kasus penggunaan:
Saya perlu menguji perangkat lunak sensitif waktu (perilaku tergantung pada tanggal).
Kasus penggunaan umum lainnya:
menjalankan perangkat lunak lawas dengan bug y2k
pengujian perangkat lunak untuk tahun-2038 kepatuhan
men-debug masalah terkait waktu, seperti sertifikat SSL yang kedaluwarsa
menjalankan perangkat lunak yang berhenti berjalan di luar jangka waktu tertentu
proses membangun deterministik.
Hal ini dimungkinkan
Solusinya adalah memalsukannya di dalam wadah. Lib ini penyadapan semua program sistem panggilan digunakan untuk mengambil waktu saat ini dan tanggal.
Implementasinya mudah. Tambahkan fungsionalitas ke Dockerfile Anda sebagaimana mestinya:
WORKDIR /RUN git clone https://github.com/wolfcw/libfaketime.gitWORKDIR /libfaketime/srcRUN make install
Ingatlah untuk mengatur variabel lingkungan LD_PRELOAD
sebelum Anda menjalankan aplikasi yang Anda inginkan Waktu palsu diterapkan.
Contoh:
CMD ["/bin/sh", "-c", "LD_PRELOAD=/usr/local/lib/faketime/libfaketime.so.1 FAKETIME_NO_CACHE=1 python /srv/intercept/manage.py runserver 0.0.0.0:3000]
Anda sekarang dapat secara dinamis mengubah waktu server:
Contoh:
import osdef set_time(request): print(datetime.today()) os.environ["FAKETIME"] = "2020-01-01" # Note: time of type string must be in the format "YYYY-MM-DD hh:mm:ss" or "+15d" print(datetime.today())
Berikut ini docker-compose
solusi:
Tambah /etc/localtime:/etc/localtime:ro
untuk volumes
atribut.
Periksa ini tautan untuk mendapatkan contoh.
Mulai wadah dengan variabel lingkungan tambahan:
docker run -e "SET_CONTAINER_TIMEZONE=true" \ -e "CONTAINER_TIMEZONE=US/Arizona" [docker image name]
Sebenarnya, saya baru saja menemukan dan menguji solusi secara positif menggunakan libfaketime
Saya akan memperbarui dengan jawaban + contoh kerja segera.
Apa yang akan menjadi tujuan melakukannya? apa kasus penggunaan Anda?