Il modo giusto per mantenere avviato il contenitore docker quando utilizzato per attività periodiche


41

Ho un contenitore docker con software installato e configurato.

Non esiste alcun programma che dovrebbe essere avviato / eseguito continuamente.

Quello che voglio - la sua capacità di avviare alcuni comandi a seconda degli eventi esterni. piace:

docker exec mysupercont /path/to/mycommand -bla -for

e

docker exec mysupercont /path/to/myothercommand 

Ma "exec" impossibile quando il contenitore viene arrestato, e anche questo contenitore contiene alcuni dati "funzionanti", che hanno usato per quei comandi, quindi non posso usare

docker run ...

ogni volta, perché ricrea il contenitore dall'immagine e distrugge i miei dati.

Qual è il modo "giusto" e "migliore" per far funzionare tali container? Quale comando posso iniziare dentro?


Questa è una domanda molto ben spiegata. Vedi un altro post simile qui .
Concedi Li il

1
docker run -d --name=name container tail -f /dev/null
potenziato a vapore il

Risposte:


46

Non è necessario esibirsi ogni volta docker run.

docker run è in realtà una sequenza di due comandi: "create" e "start".

Quando si esegue il contenitore, è necessario specificare " -it":

-i, --interactive = false Mantieni STDIN aperto anche se non collegato
-t, --tty = false Assegna uno pseudo-TTY

Esempio:

docker run -it debian:stable bash

Dopo che il lavoro è stato completato, il comando è stato specificato all'avvio (nel mio esempio bash). Ad esempio, si esegue "exit". Fermate del contenitore:

CONTAINER ID        IMAGE                      COMMAND                CREATED             STATUS                     PORTS               NAMES
1329c99a831b        debian:stable              "bash"                 51 seconds ago      Exited (0) 1 seconds ago                       goofy_bardeen

Ora puoi ricominciare

docker start 1329c99a831b

Il contenitore viene avviato ed esegue nuovamente il comando "bash".
Collegati a questa sessione "bash" con il comando

docker attach 1329c99a831b

Per riassumere : devi capire la differenza tra il contenitore rune start.
Inoltre, guarda la documentazione per il ruolo dei parametri " -i t" e " -d" per "Esegui"


1
aha, lo capisco. La domanda era: non ho nulla da eseguire all'interno del container, ma devo mantenerlo nello stato "run" Quindi la tua risposta è: usa bash per mantenere il container nello stato di esecuzione?
Korjavin Ivan,

Sì. Il processo specificato in fase di esecuzione deve essere in esecuzione nel contenitore ha continuato a funzionare. L'esempio più semplice è bash. Forse sarai il modo più semplice per avviare il contenitore con "-d" e collegarti ad esso secondo necessità usando il docker attach ID. Esci da questa sessione senza terminare bash, puoi usareCTRL-p CTRL-q
MSemochkin il

Il processo specificato durante l'esecuzione del contenitore riceve il PID 1. Di conseguenza, il contenitore semplicemente non può funzionare senza di esso ☺
MSemochkin,

La mia esperienza con start e attach (o inizia con -ai) è che la modifica rapida e interattiva della riga di comando non mostra. Ad esempio, il tty non esegue il rendering o l'eco.
dlamblin,

1
Questo è carino. Si noti che se si desidera avviare il contenitore in background senza doverlo riavviare manualmente (ad esempio se si esegue un servizio Web), utilizzare i parametri '-itd' e CTRL-p CTRL-q per staccare senza arrestare il contenitore.
Taranaki,

6

Tutta questa faccenda sulla possibilità o meno di avviare un container arrestato dipende dal modo in cui il container è stato originariamente creato, ovvero eseguito. Se è stato eseguito un comando che è terminato o si esce da un comando interattivo, ad esempio bash, non è possibile avviare, riavviare o eseguire il contenitore arrestato. Tutto quello che puoi fare è rimuoverlo. È spazzatura.

Ma l'ultimo commento di Taranaki, usare '-itd', sembra essere quello che la finestra mobile ha ordinato.

Il contenitore continua a funzionare e puoi eseguire quello che vuoi e puoi fermare, avviare o riavviare il contenitore. Naturalmente, questa è solo una scoperta preliminare basata sull'immagine alpina. Nota, se si collega al contenitore, si fermerà quando si esce, ma è possibile avviarlo nuovamente.


3
+1 "sembra essere quello che la finestra mobile ha ordinato" :-)
Matt Alexander

5

Dal momento che hai citato compiti periodici e probabilmente stai usando qualcosa come cron a causa del modo in cui vuoi usare docker exec, ho solo la medicina per te. Almeno ho finito per fare qualcosa del genere.

  1. Dockerfile

    FROM <some base>
    CMD tail -f /dev/null
    
  2. Corri con il solito docker run -d ....(ho usato docker-compose)

  3. Configurare crontab dei computer host, ad esempio:

    * * * * * docker exec mysupercont foo >> /var/log/foo.log 2>&1
    * * * * * docker exec mysupercont bar >> /var/log/bar.log 2>&1
    

Trovo questa soluzione piacevole quando possiamo fare affidamento sull'antico e collaudato crontab in un ambiente linux piuttosto predefinito, mentre Docker gestisce i deps e le variabili di ambiente più esotici della tua logica aziendale. È inoltre possibile impostare alcuni limiti se le attività periodiche si bloccano e presentano perdite di memoria o altro.


0

La coda provoca comunque alcune operazioni sui file di volta in volta.

Ecco la mia soluzione per dormire per sempre, senza effetti collaterali.

# Ah, ha, ha, ha, stayin' alive...
while true; do :; done & kill -STOP $! && wait $!

Come funziona

while true; do :; done & # do nothing(:) in background, in an endless loop
kill -STOP $!            # stop the background process of doing nothing
wait $!                  # wait forever, because doing nothing process is stopped

1
difficile capire cosa stia facendo. perché non dormire solo 3650d
Pieter

1
Hai ragione, il sonno probabilmente funzionerebbe altrettanto bene della mia soluzione, tuttavia alla fine il sonno si interromperà MrGreen PS: aggiungerò alcuni commenti, per rendere la mia soluzione facile da capire.
qoomon il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.