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.