2015-08-07 20 views
33

Ora sto provando a eseguire un semplice contenitore con shell (/ bin/bash) su Kubernetes Cluster.Come posso mantenere il contenitore in esecuzione su Kubernetes?

Ho pensato che esiste un modo per mantenere il contenitore in esecuzione sul contenitore finestra mobile utilizzando l'opzione pseudo-tty e scollega (opzione -td sul comando docker run).

Per esempio

$ sudo docker run -td ubuntu:latest

C'è qualche opzione come questo in kubernetes?

Ho provato a fare funzionare contenitore utilizzando kubectl run-container comando come

kubectl run-container test_container ubuntu:latest --replicas=1

ma uscite di contenitori in pochi secondi (proprio come il lancio con docker run comando senza opzioni che ho citato sopra.) E ReplicationController lancia di nuovo più volte .

C'è un modo per mantenere il contenitore runnning su Kubernetes come opzioni -td nel comando docker run?

+0

L'utilizzo di questa immagine (come [Kubernetes docs] (https://kubernetes.io/docs/concepts/services-networking/connect-applications-service/#dns) suggerisce) è abbastanza utile: ' kubectl run curl --image = radial/busyboxplus: curl -i --tty' –

risposta

18

Un contenitore esce quando termina il processo principale. Fare qualcosa di simile:

docker run -itd debian 

per tenere il contenitore aperto è francamente un hack che dovrebbe essere utilizzato solo per test rapidi ed esempi. Se si desidera solo un contenitore per il test per alcuni minuti, vorrei fare:

docker run -d debian sleep 300 

che ha il vantaggio che il contenitore verrà automaticamente uscire se non pensarci più. In alternativa, è possibile inserire qualcosa di simile in un ciclo while per mantenerlo in esecuzione per sempre, o semplicemente eseguire un'applicazione come top. Tutti questi dovrebbero essere facili da fare in Kubernetes.

La vera domanda è perché vorresti farlo? Il tuo contenitore dovrebbe fornire un servizio, il cui processo manterrà il contenitore in esecuzione in background.

+0

Grazie per la risposta. Ora sto cercando di capire il comportamento dei contenitori, con dozzine di contenitori in esecuzione contemporaneamente. Ciclo infinito e usando altri comandi pesanti, mi impedisce di sapere qual è il comportamento dei contenitori. Questo è il motivo per cui ho bisogno di un contenitore semplice come solo running/bin/bash. – springwell

+0

Per ora, proverò a eseguire 'cat' senza argomenti e' top' e 'sleep' con argomenti di grande numero. – springwell

+7

'sleep infinity' funziona in molti casi (non busybox) – rwilson04

5

Sono riuscito a farlo funzionare con il comando sleep infinity in kubernetes, che manterrà il contenitore aperto. Vedere this answer per le alternative quando non funziona.

+0

Questo non fornisce una risposta alla domanda. Per criticare o richiedere chiarimenti da un autore, lascia un commento sotto il loro post. - [Dalla recensione] (/ recensione/post di bassa qualità/11368189) – Will

+1

@Will Certo che lo fa. 'sleep infinity' mantiene aperto il contenitore, fornendo lo stesso tipo di funzionalità che la domanda richiede (per la maggior parte dei tipi di contenitori). Fornisce anche un collegamento alle alternative per i casi in cui quel comando specifico non funziona – rwilson04

+0

Questo era da revisione. Se aggiungi il testo del commento alla risposta, allora è una risposta di qualità :) La mia iniziale segnalazione/encomio era basata sul dire che il tuo commento non ha avuto successo, facendomi pensare che questo doveva essere un commento. Aggiunta una modifica rapida e upvoted. – Will

32

È possibile utilizzare questo CMD nella vostra Dockerfile:

CMD exec /bin/bash -c "trap : TERM INT; sleep infinity & wait" 

Ciò manterrà vivo il vostro contenitore fino a che non viene detto di smettere. Utilizzando trap e wait, il tuo contenitore reagisce immediatamente a una richiesta di arresto. Senza trappola/attesa, ci vorranno alcuni secondi.

+0

Sto usando lo stesso su yaml di kubernetes per scopi di debug – sdkks

18

I contenitori devono essere completati. Devi fornire al tuo contenitore un compito che non finirà mai.Qualcosa del genere dovrebbe funzionare:

apiVersion: v1 
kind: Pod 
metadata: 
    name: ubuntu 
spec: 
    containers: 
    - name: ubuntu 
    image: ubuntu:latest 
    # Just spin & wait forever 
    command: [ "/bin/bash", "-c", "--" ] 
    args: [ "while true; do sleep 30; done;" ] 
+0

Ha funzionato come un incantesimo, grazie – SergeyB

5
  1. Nella tua Dockerfile utilizzare questo comando:

    CMD ["sh", "-c", "tail -f /dev/null"]

  2. Costruire la vostra immagine finestra mobile.

  3. Spingilo sul tuo cluster o simile, solo per assicurarti che l'immagine sia disponibile.
  4. kubectl run debug-container -it --image=<your-image>
0

Nel mio caso, un baccello con un'initContainer non è riuscito a inizializzare. L'esecuzione di docker ps -a e quindi docker logs exited-container-id-here mi ha fornito un messaggio di registro che non è stato visualizzato kubectl logs podname. Mystery risolto :-)

Problemi correlati