tag run library images imagenes hub example dockers docker containers kubernetes google-container-engine google-kubernetes-engine

run - dockers images



¿Cómo puedo mantener un contenedor funcionando en Kubernetes? (9)

Ahora estoy tratando de ejecutar un contenedor simple con shell (/ bin / bash) en un clúster de Kubernetes.

Pensé que había una manera de mantener un contenedor ejecutándose en un contenedor Docker utilizando la opción pseudo-tty y -td (opción -td en el comando docker run ).

Por ejemplo,

$ sudo docker run -td ubuntu:latest

¿Hay una opción como esta en Kubernetes?

Intenté ejecutar un contenedor utilizando un kubectl run-container como:

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

Pero el contenedor sale por unos segundos (al igual que se inicia con el comando docker run sin las opciones que mencioné anteriormente). Y ReplicationController lo vuelve a lanzar repetidamente.

¿Hay alguna manera de mantener un contenedor ejecutándose en Kubernetes como las opciones -td en el comando docker run ?


  1. En su Dockerfile use este comando:

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

  2. Construye tu imagen acoplable.

  3. Empújalo a tu clúster o similar, solo para asegurarte de que la imagen esté disponible.
  4. kubectl run debug-container -it --image=<your-image>

El comando más simple como puede ser que el manifiesto de pod k8s ejecute el contenedor para siempre:

apiVersion: v1 kind: Pod metadata: name: ubuntu spec: containers: - name: ubuntu image: ubuntu:latest # Just sleep forever command: [ "sleep" ] args: [ "infinity" ]


En mi caso, un pod con un initContainer no pudo inicializarse. Ejecutar docker ps -a y luego los docker logs exited-container-id-here me dieron un mensaje de registro que kubectl logs podname no mostraba. Misterio resuelto :-)


Los contenedores deben ejecutarse hasta su finalización. Debe proporcionar a su contenedor una tarea que nunca terminará. Algo como esto debería funcionar:

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;" ]


Para mantener un POD funcionando, el POD debe realizar cierta tarea, de lo contrario, Kubernetes lo encontrará innecesario, por lo tanto, se cierra. Hay muchas formas de mantener un POD en funcionamiento.

Me he enfrentado a problemas similares cuando necesitaba un POD solo para funcionar continuamente sin hacer nada. Las siguientes son las dos formas en que funcionaron para mí:

  1. Activando un comando de suspensión mientras se ejecuta el contenedor.
  2. Ejecutando un bucle infinito dentro del contenedor.

Aunque la primera opción es más fácil que la segunda y puede satisfacer el requisito, no es la mejor opción. Como, hay un límite en cuanto a la cantidad de segundos que va a asignar en el comando de suspensión. Pero un contenedor con bucle infinito que se ejecuta dentro nunca sale.

Sin embargo, describiré ambas formas (teniendo en cuenta que está ejecutando el contenedor busybox):

1. Comando del sueño

apiVersion: v1 kind: Pod metadata: name: busybox labels: app: busybox spec: containers: - name: busybox image: busybox ports: - containerPort: 80 command: ["/bin/sh", "-ec", "sleep 1000"] nodeSelector: beta.kubernetes.io/os: linux

2. bucle infinito

apiVersion: v1 kind: Pod metadata: name: busybox labels: app: busybox spec: containers: - name: busybox image: busybox ports: - containerPort: 80 command: ["/bin/sh", "-ec", "while :; do echo ''.''; sleep 5 ; done"] nodeSelector: beta.kubernetes.io/os: linux

Ejecute el siguiente comando para ejecutar el pod:

kubectl apply -f <pod-yaml-file-name>.yaml

¡Espero eso ayude!


Pude hacer que esto funcione con el comando sleep infinity en Kubernetes, que mantendrá el contenedor abierto. Vea esta respuesta para alternativas cuando eso no funciona.


Puede usar este CMD en su Dockerfile :

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

Esto mantendrá su contenedor con vida hasta que se le indique que se detenga. El uso de trap y wait hará que su contenedor reaccione de inmediato a una solicitud de detención . Sin trampa / espera, la detención demorará unos segundos.

Para las imágenes basadas en busybox (utilizadas en imágenes basadas en alpinos), sleep no conoce el argumento de infinito. Esta solución alternativa le brinda la misma respuesta inmediata a una docker stop como en el ejemplo anterior:

CMD exec /bin/sh -c "trap : TERM INT; (while true; do sleep 1000; done) & wait"


Un contenedor sale cuando sale su proceso principal. Haciendo algo como:

docker run -itd debian

Francamente, mantener el contenedor abierto es un truco que solo debe usarse para pruebas y ejemplos rápidos. Si solo desea un contenedor para probar durante unos minutos, yo haría:

docker run -d debian sleep 300

Lo cual tiene la ventaja de que el contenedor saldrá automáticamente si lo olvida. Alternativamente, podría poner algo como esto en un bucle while para mantenerlo funcionando para siempre, o simplemente ejecutar una aplicación como top . Todo esto debería ser fácil de hacer en Kubernetes.

La verdadera pregunta es ¿por qué querrías hacer esto? Su contenedor debe proporcionar un servicio, cuyo proceso mantendrá el contenedor ejecutándose en segundo plano.


Use este comando dentro de su Dockerfile para mantener el contenedor ejecutándose en su clúster K8:

  • CMD tail -f / dev / null