Cara mengatur waktu sistem secara dinamis dalam wadah Docker

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?

Silakan lihat edit.