Comment puis-je garder le conteneur en cours D'exécution sur Kubernetes?

J'essaie maintenant d'exécuter un conteneur simple avec shell (/bin / bash) sur le Cluster Kubernetes.

Je pensais qu'il existe un moyen de garder le conteneur en cours d'exécution sur le conteneur docker en utilisant l'option pseudo-tty et detach (-td option sur la commande docker run).

Par Exemple

$ sudo docker run -td ubuntu:latest

Y a-t-il une option comme celle-ci dans kubernetes?

J'ai essayé d'exécuter container en utilisant la commande kubectl run-container comme

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

Mais le conteneur sort en quelques secondes (tout comme lancement avec la commande docker run sans options que j'ai mentionnées ci-dessus.) et ReplicationController le lance à nouveau à plusieurs reprises.

Existe-t-il un moyen de garder le conteneur en cours D'exécution sur Kubernetes comme les options-td dans la commande docker run?

52
demandé sur springwell 2015-08-07 08:20:51

6 réponses

Un conteneur se termine lorsque son processus principal se termine. Faire quelque chose comme:

docker run -itd debian

Maintenir le conteneur ouvert est franchement un hack qui ne devrait être utilisé que pour des tests rapides et des exemples. Si vous voulez juste un conteneur pour tester pendant quelques minutes, je ferais:

docker run -d debian sleep 300

Qui a l'avantage que le conteneur sortira automatiquement si vous l'oubliez. Alternativement, vous pouvez mettre quelque chose comme ça dans une boucle while pour le garder en cours d'exécution pour toujours, ou simplement exécuter une application comme top. Tout cela devrait être facile à faire dans Kubernetes.

La vraie question est, pourquoi voudriez-vous faire cela? Votre conteneur devrait fournir un service, dont le processus maintiendra le conteneur en cours d'exécution en arrière-plan.

24
répondu Adrian Mouat 2015-08-07 13:31:24

Vous pouvez utiliser ce CMD dans votre Dockerfile:

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

Cela gardera votre conteneur en vie jusqu'à ce qu'on lui dise de s'arrêter. En utilisant trap et wait, votre conteneur réagira immédiatement à une demande d'arrêt . Sans piège / attendre l'arrêt prendra quelques secondes.

Pour les images basées sur busybox (utilisées dans les images basées sur alpine), le sommeil ne connaît pas l'argument infinity. Cette solution de contournement vous donne la même réponse immédiate à un docker stop comme dans l'exemple ci-dessus:

CMD exec /bin/sh -c "trap : TERM INT; (while true; do sleep 1000; done) & wait"
48
répondu itsafire 2018-07-04 13:35:28

Les conteneurs

Sont destinés à s'exécuter jusqu'à la fin. Vous devez fournir à votre conteneur une tâche qui ne se terminera jamais. Quelque chose comme ça devrait fonctionner:

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;" ]
47
répondu Joel B 2016-10-17 18:35:08
  1. Dans votre Dockerfile, utilisez cette commande:

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

  2. Construisez votre image docker.

  3. poussez-le vers votre cluster ou similaire, juste pour vous assurer que l'image est disponible.
  4. kubectl run debug-container -it --image=<your-image>
7
répondu Radu Gabriel 2016-11-15 08:34:24

J'ai pu faire fonctionner cela avec la commande sleep infinity dans kubernetes, ce qui gardera le conteneur ouvert. Voir cette réponse pour les alternatives quand cela ne fonctionne pas.

5
répondu rwilson04 2017-05-23 12:02:58

Dans mon cas, un pod avec un initContainer n'a pas réussi à s'initialiser. L'exécution de docker ps -a puis docker logs exited-container-id-here m'a donné un message de journal que kubectl logs podname n'a pas affiché. Mystère résolu: -)

1
répondu Stefan L 2017-12-04 16:33:28