Docker kapsayıcısında sistem saati dinamik olarak nasıl ayarlanır


28

Ana makineyi etkilemeden bir Docker konteyner sistemi saatini dinamik olarak (çalışma zamanında) ayarlamanın bir yolu var mı?

kullanma

hwclock --set --date "Sat Aug 17 08:31:24 PDT 2016"

aşağıdaki hatayı veriyor:

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.

kullanma

date -s "2 OCT 2006 18:00:00"

aşağıdaki hatayı veriyor:

date: cannot set date: Operation not permitted

Kullanım durumda:

Zamana duyarlı yazılımı test etmem gerekiyor (davranış tarihe göre değişir).

Diğer yaygın kullanım durumları:

  • y2k hataları ile eski yazılımı çalışan
  • 2038 yılı uyumluluğu için test yazılımı
  • süresi dolmuş SSL sertifikaları gibi hatalarla ilgili hata ayıklama
  • belirli bir zaman dilimi dışında çalışmayı durduran çalışan yazılım
  • deterministik inşa süreçleri.

Bunu yapmanın amacı ne olurdu? kullanım durumun nedir?
dawud

Lütfen düzenlemeye bakınız.
Vingtoft


1
Aslında, libfaketime github.com/wolfcw/libfaketime kullanarak bir çözümü buldum ve olumlu bir şekilde test ettim.
Vingtoft

Yanıtlar:


21

Bu mümkün

Çözüm, kapta sahte yapmaktır. Bu lib , geçerli saat ve tarihi almak için kullanılan tüm sistem çağrı programlarını engeller.

Uygulama kolaydır. Dockerfile’inize işlevsellik ekleyin:

WORKDIR /
RUN git clone https://github.com/wolfcw/libfaketime.git
WORKDIR /libfaketime/src
RUN make install

LD_PRELOADTakma zamanının uygulanmasını istediğiniz uygulamayı çalıştırmadan önce ortam değişkenlerini ayarlamayı unutmayın .

Örnek:

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]

Artık sunucuların zamanını dinamik olarak değiştirebilirsiniz:

Örnek:

import os
def 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())

6
Bu çözüme gelen diğer kişiler için, bunun golang uygulamaları veya statik olarak bağlı diğer exes için işe yaramayacağının farkında olun.
Sentinel

5
@Sentinel'e teşekkürler. Yeterince komik, sadece bu cevabı google üzerinden buldum, özellikle bir golang uygulamasıyla kullanmak istiyorum ve bu yorumu sadece 2 saat önce 1,5 yıllık bir soruya bıraktığınızı fark ettim. Benim için gibiydi. Teşekkürler! :)
dimonomid 16:18

Neden senin durumunda çalışmıyor? Golang, zaman kazanmak için sistem çağrılarını kullanmıyor mu? @ dimonomid Denemenizi öneririm, çözümü uygulamak hızlı.
Vingtoft

1
@Vingtoft Aslında işe yarıyorsa bana haber verin, ancak etrafta arama yapın. Golang kütüphanelerde dinamik olarak bağlantı kurmuyor.
Sentinel

1
@ dimonomid Evet Oldukça hayal kırıklığına uğradım. Aslında Docker ile daha çok hayal kırıklığına uğradım. Zamanlama ile ilgili testleri yapmam gerekiyor. Bu Docker'ı "konteyner" olarak kullanışsız kılar. Saat dilimi senkronizasyonu için sistem zaman çağrılarının engellenmesinin Docker gündeminde 1. maddede olacağını düşünmüştüm. Görünüşe göre öyle değil.
Sentinel

4

Jenny D, varsayılan olarak Docker kabının sistem saatine erişime izin vermediğinden doğrudur.

Bununla birlikte, Linux'ta, kabınız bu özelliğe erişebiliyorsa, bu kabiliyeti, kabı oluştururken "docker run" komutunun "--cap-add = SYS_TIME" seçeneğini kullanarak sağlayabilirsiniz:

# docker run --cap-add=SYS_TIME -d --name teamcity-server-instance -v /opt/teamcity/data:/data/teamcity_server/datadir -v /opt/teamcity/logs:/opt/teamcity/logs -p 80:8111 jetbrains/teamcity-server

Ardından süreyi çalışan kabın içinden değiştirebilirsiniz:

# docker exec -it teamcity-server-instance /bin/bash
# date +%T -s "15:03:00"
15:03:00
#

Referans dokümantasyon: https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities


2
Bu, ana makinedeki zamanı değiştirir. Bir Linux sistemindeki süre şu anda ad alanında değildir, ana bilgisayar ve tüm kapsayıcılar için yalnızca bir değer vardır.
BMitch

Evet haklısın. Bu, ana makine saatinin zamanını değiştirir. Sadece soruyu tekrar okuyun ve ana makinenin saatini değiştirmemek konusunda açıkça bahsettiğimiz soruyu fark ettim. Düzeltilmiş duruyorum :)
Oleg Kazakov

0

Kabı ek bir ortam değişkeni ile başlatın:

docker run -e "SET_CONTAINER_TIMEZONE=true" \
           -e "CONTAINER_TIMEZONE=US/Arizona" [docker image name]

Zamanı dinamik olarak ayarlamanın bir yolunu arıyorum, yani çalışma zamanında ayarlanabilir. Sorumu güncelledim.
Vingtoft

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.