2015-04-10 16 views
11

Ho un contenitore con un programma in esecuzione all'interno di tomcat. Devo cambiare la data solo in questo contenitore e testare il comportamento del mio programma. Ho una logica sensibile al tempo e a volte ho bisogno di vedere cosa succede in pochi giorni o mesi dopo. E 'possibile nella finestra mobile? Ho letto che se cambio la data nel contenitore, la data verrà modificata sul sistema host. Ma è una cattiva idea per me. Ho bisogno di avere alcune istanze di questa applicazione su un server e avere la possibilità di impostare tempi diversi per ogni istanza.È possibile modificare la data nel contenitore mobile?

Ma quando provo a cambiare la data all'interno del contenitore ottengo l'errore:

sudo date 04101812 
date: cannot set date: Operation not permitted 
Fri Apr 10 18:12:00 UTC 2015 
+1

Potresti aggiungere qualche altra descrizione del problema che hai? – abarisone

+1

se è necessario modificare la data per meno di 24 ore, vedere il mio commento http://stackoverflow.com/questions/29432395/creating-clock-skew-with-docker/29435396#29435396 – user2915097

+0

@abarisone ho scritto la descrizione più dettagliata –

risposta

6

Questo non è possibile con Docker. Docker utilizza lo stesso clock del kernel esterno. Quello di cui hai bisogno è una virtualizzazione completa che emuli un PC completo.

Il sudo non riesce perché rende solo root dell'ambiente virtuale all'interno del contenitore. Questo utente non è correlato al reale root del sistema host (eccetto per nome e UID) e non può fare ciò che potrebbe fare il vero root.

In te usi un linguaggio di alto livello come Python o Java, spesso hai ganci dove puoi simulare un certo tempo di sistema per i test o puoi scrivere codice che avvolge "ottenere l'ora corrente dal sistema" e restituisce ciò che richiede il tuo test .

-6

Sì, l'ho provato e funziona!

uso --privileged quando runing la vostra immagine

esempio:

docker run -i -t --rm --privileged my_image /bin/bash 
+2

Utilizzando l'opzione --privileged qui farà sì che il comando dal contenitore influenzi l'host della finestra mobile. Anche altre cose brutte possono accadere se usi il privilegio senza conoscere gli effetti. – Myz

13

E 'molto possibile modificare dinamicamente il tempo in un contenitore di Docker, senza influenzare il sistema operativo host.

La soluzione è fingere. This lib intercetta tutti i programmi di chiamata di sistema utilizzati per recuperare l'ora e la data correnti.

L'implementazione è semplice. Aggiungere funzionalità al Dockerfile a seconda dei casi:

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

Ricordate di impostare le variabili di ambiente LD_PRELOAD prima di eseguire l'applicazione che si desidera che il tempo finto applicato a.

Esempio:

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] 

È ora possibile modificare dinamicamente il tempo di server:

Esempio:

def set_time(request): 
    import os 
    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()) 
+1

Funziona all'interno di un contenitore di Docker. Ho inserito la finestra mobile per installare la libreria e ho usato 'export' per impostare le variabili. – roman

+1

Questa soluzione ha funzionato perfettamente anche per me. Ho fatto quello che Roman suggeriva in precedenza, ho inserito il contenitore, ho controllato il codice usando git, ho eseguito il make install, poi ho eseguito il commit della mia immagine e ho riavviato il container usando il seguente metodo 'docker run -it --rm [varie opzioni omesse] spooforbrains/image1/bin/bash -c "export LD_PRELOAD =/usr/local/lib/faketime/libfaketime.so.1; export FAKETIME_NO_CACHE = 1; export FAKETIME = \" 2016-05-01 12:00: 00 \ "; node nodeimage" ' – SpooForBrains

+0

Questo metodo' def set_time (request): 'dove lo stai definendo? All'interno del Dockerfile? – chrismanderson

0

Questo ha funzionato per me, forse si potrebbe provare:

dpkg-reconfigure tzdata

Modifica: eseguilo all'interno del contenitore in cui si verificano problemi. Apparirà un'interfaccia. Lì puoi modificare il fuso orario e il fuso orario locale, ad esempio, e impostarlo correttamente, che ha risolto il mio problema, che era lo stesso del tuo.

Buona fortuna!

+2

È necessario aggiungere ulteriori spiegazioni alla risposta. –

+0

fatto, grazie !!! – C4rlos96

Problemi correlati