run imagen hub dockers container compose comandos docker

imagen - dockers container download



¿Cómo ejecuto un comando en un contenedor Docker ya existente? (12)

He creado un contenedor con -d por lo que no es interactivo.

docker run -d shykes/pybuilder bin/bash

Veo que el contenedor ha salido:

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d6c45e8cc5f0 shykes/pybuilder:latest "bin/bash" 41 minutes ago Exited (0) 2 seconds ago clever_bardeen

Ahora me gustaría ejecutar comandos ocasionales en la máquina y salir. Sólo para obtener la respuesta.

Intenté arrancar la máquina. Traté de adjuntar. Pensé que podría llamar run con un contenedor, pero eso no parece estar permitido. Usando el start parece que solo se ejecuta y luego existe rápidamente.

Me gustaría volver al modo interactivo después de salir.

Lo intenté:

docker attach d6c45e8cc5f0

Pero me sale:

2014/10/01 22:33:34 You cannot attach to a stopped container, start it first

Pero si lo empiezo, sale de todos modos. Atrapa 22. No puedo ganar.


Algunas de las respuestas aquí son engañosas porque se refieren a contenedores que se están ejecutando, no detenidos.

Sven Dowideit explicó en el foro de Docker que los contenedores están vinculados a su proceso (y Docker no puede cambiar el proceso de un contenedor detenido, aparentemente debido al menos a su estructura interna: https://github.com/docker/docker/issues/1437 ). Entonces, básicamente, la única opción es commit el contenedor a una imagen y run con un comando diferente.

Consulte https://forums.docker.com/t/run-command-in-stopped-container/343
(Creo que el ENTRYPOINT " ENTRYPOINT con argumentos" tampoco funcionaría, ya que todavía no podría cambiar los argumentos a un contenedor detenido).


Así que creo que la respuesta es simple que muchas respuestas engañosas de arriba.

Para iniciar un contenedor existente que está detenido

docker start <container-name/ID>

Para detener un contenedor en ejecución

docker stop <container-name/ID>

Luego, para iniciar sesión en el shell interactivo de un contenedor

docker exec -it <container-name/ID> bash


Creando un contenedor y enviándole comandos, uno por uno:

docker create --name=my_new_container -it ubuntu docker start my_new_container // ps -a says ''Up X seconds'' docker exec my_new_container /path/to/my/command // ps -a still says ''Up X+Y seconds'' docker exec my_new_container /path/to/another/command


Desafortunadamente, es imposible anular ENTRYPOINT con argumentos con la docker run --entrypoint para lograr este objetivo.

Nota: puede anular la configuración de ENTRYPOINT utilizando --entrypoint, pero esto solo puede establecer el binario en exec (no se utilizará sh -c).


En octubre de 2014, el equipo de Docker introdujo el comando docker exec : https://docs.docker.com/engine/reference/commandline/exec/

Así que ahora puede ejecutar cualquier comando en un contenedor en ejecución simplemente sabiendo su ID (o nombre):

docker exec -it <container_id_or_name> echo "Hello from container!"

Tenga en cuenta que el comando exec solo funciona en el contenedor que ya se está ejecutando. Si el contenedor está detenido actualmente, primero debe ejecutarlo con el siguiente comando:

docker run -it -d shykes/pybuilder /bin/bash

Lo más importante aquí es la opción -d , que significa detached . Significa que el comando que inicialmente proporcionó al contenedor ( /bin/bash ) se ejecutará en segundo plano y el contenedor no se detendrá de inmediato .


Esta es una respuesta combinada que inventé utilizando la respuesta de CDR LDN anterior y la respuesta que encontré here .

El siguiente ejemplo inicia un contenedor de Arch Linux desde una imagen y luego instala git en ese contenedor usando la herramienta pacman :

sudo docker run -it -d archlinux /bin/bash sudo docker ps -l sudo docker exec -it [container_ID] script /dev/null -c "pacman -S git --noconfirm"

Eso es todo.


Para ampliar la respuesta de katrmr, si el contenedor se detiene y no puede iniciarse debido a un error, deberá commit a una imagen. Entonces puedes lanzar bash en la nueva imagen:

docker commit [CONTAINER_ID] temporary_image docker run --entrypoint=bash -it temporary_image


Respuesta simple: iniciar y adjuntar al mismo tiempo. En este caso estás haciendo exactamente lo que pediste.

docker start <CONTAINER_ID/CONTAINER_NAME> && docker attach <CONTAINER_ID/CONTAINER_NAME>

Asegúrese de cambiar <CONTAINER_ID/CONTAINER_NAME>


Su contenedor saldrá a medida que finalice el comando que le dio. Usa las siguientes opciones para mantenerlo en vivo:

  • -i Mantenga STDIN abierto incluso si no está conectado.
  • -t Asignar un pseudo-TTY.

Así que su nuevo comando de run es:

docker run -it -d shykes/pybuilder bin/bash

Si desea adjuntar a un contenedor ya en ejecución:

docker exec -it CONTAINER_ID /bin/bash

En estos ejemplos, /bin/bash se utiliza como comando.


Suponiendo que la imagen utiliza el punto de entrada predeterminado /bin/sh -c , la ejecución de /bin/bash saldrá inmediatamente en modo daemon ( -d ). Si desea que este contenedor ejecute un shell interactivo, use -it lugar de -d . Si desea ejecutar comandos arbitrarios en un contenedor que normalmente ejecuta otro proceso, es posible que desee probar nsenter o nsinit . https://blog.codecentric.de/en/2014/07/enter-docker-container/ los detalles en https://blog.codecentric.de/en/2014/07/enter-docker-container/ .


Tuve que usar bash -c para ejecutar mi comando: docker exec -it CONTAINER_ID bash -c "mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql mysql"


Dale una orden a stdin

Debe quitar la -t para que funcione:

echo ''touch myfile'' | sudo docker exec -i CONTAINER_NAME bash

Esto puede ser más conveniente que usar opciones de CLI a veces.

Probado con:

sudo docker run --name ub16 -it ubuntu:16.04 bash

luego en otra concha:

echo ''touch myfile'' | sudo docker exec -i ub16 bash

Luego en la primera concha:

ls -l myfile

en Docker 1.13.1, host de Ubuntu 16.04.