Creé un contenedor con -d
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. Solo para obtener la respuesta.
Traté de encender la máquina. Traté de adjuntar. Pensé que podía llamar run
con un contenedor, pero eso no parece estar permitido. El uso start
simplemente parece ejecutarse y luego existir 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 comienzo, sale de todos modos. Captura 22. No puedo ganar.
docker container ls -a
Respuestas:
En octubre de 2014, el equipo de Docker introdujo el
docker exec
comando : https://docs.docker.com/engine/reference/commandline/exec/Entonces, ahora puede ejecutar cualquier comando en un contenedor en ejecución con solo conocer su ID (o nombre):
Tenga en cuenta que el
exec
comando solo funciona en el contenedor que ya se está ejecutando. Si el contenedor está actualmente detenido, primero debe ejecutarlo con el siguiente comando:Lo más importante aquí es la
-d
opción, que significadetached
. Significa que el comando que proporcionó inicialmente al contenedor (/bin/bash
) se ejecutará en segundo plano y el contenedor no se detendrá de inmediato .fuente
CDR LDN
acdrev
para la respuesta a continuación ( stackoverflow.com/a/26181666/149428 ).-it
?Su contenedor salir como el comando que diste va a terminar. Use las siguientes opciones para mantenerlo vivo:
-i
Mantenga STDIN abierto incluso si no está conectado.-t
Asignar un pseudo-TTY.Entonces su nuevo
run
comando es:Si desea adjuntar a un contenedor que ya se está ejecutando:
En estos ejemplos
/bin/bash
se utiliza como comando.fuente
docker exec -it CONTAINER_ID /bin/bash -c "export VAR=1 && echo $VAR"
e impreso variable vacía (esperado1
). ¿Qué me estoy perdiendo?-it
no está disponible.Así que creo que la respuesta es más simple que muchas respuestas engañosas anteriores.
Para iniciar un contenedor existente que se detiene
Para detener un contenedor en funcionamiento
Luego, para iniciar sesión en el shell interactivo de un contenedor
Para iniciar un contenedor existente y adjuntarlo en un comando
Cuidado, esto detendrá el contenedor a la salida. Pero en general, debe iniciar el contenedor, adjuntarlo y detenerlo una vez que haya terminado.
fuente
Para ampliar la respuesta de katrmr, si el contenedor se detiene y no se puede iniciar debido a un error, deberá
commit
hacerlo en una imagen. Luego puede iniciar bash en la nueva imagen:fuente
dshell
para hacerlo automáticamente en una variedad de situaciones: github.com/avirshup/docker-cli-sugarAlgunas de las respuestas aquí son engañosas porque se refieren a contenedores que se ejecutan, no se detienen.
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 yrun
con un comando diferente.Consulte https://forums.docker.com/t/run-command-in-stopped-container/343
(creo que el
ENTRYPOINT
enfoque " con argumentos" tampoco funcionaría, ya que aún no podría cambiar el argumentos a un contenedor detenido.)fuente
bin/bash
sin-it
no cambiaría nada en el contenedor, por lo que comprometerse no es realmente necesario y CDR LDN da la respuesta correcta para la situación particular del OP. Aún así,commit
es la respuesta al problema técnico de cómo cambiar el proceso del contenedor.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"
fuente
Creando un contenedor y enviándole comandos, uno por uno:
fuente
Esta es una respuesta combinada que inventé usando la respuesta CDR LDN anterior y la respuesta que encontré aquí .
El siguiente ejemplo inicia un contenedor Arch Linux desde una imagen, y luego se instala
git
en ese contenedor utilizando lapacman
herramienta:Eso es todo.
fuente
Si está intentando ejecutar el script de shell, debe ejecutarlo como bash.
fuente
Canalizar un comando a stdin
Debe eliminar el
-t
para que funcione:Esto puede ser más conveniente que usar las opciones de CLI a veces.
Probado con:
luego en otro caparazón:
Luego en el primer caparazón:
Probado en Docker 1.13.1, host Ubuntu 16.04.
fuente
Asumiendo que la imagen está usando el punto de entrada predeterminado
/bin/sh -c
, la ejecución/bin/bash
saldrá inmediatamente en modo demonio (-d
). Si desea que este contenedor ejecute un shell interactivo, use en-it
lugar de-d
. Si desea ejecutar comandos arbitrarios en un contenedor que generalmente ejecuta otro proceso, puede intentarlonsenter
onsinit
. Eche un vistazo a https://blog.codecentric.de/en/2014/07/enter-docker-container/ para más detalles.fuente
Lamentablemente, es imposible anular
ENTRYPOINT
con argumentosdocker run --entrypoint
para lograr este objetivo.fuente
Me gustaría señalar que la respuesta principal es un poco engañosa.
El problema con la ejecución
docker run
es que cada vez se crea un nuevo contenedor. Sin embargo, hay casos en los que nos gustaría volver a visitar los contenedores antiguos o no ocupar espacio con contenedores nuevos.(Dado
clever_bardeen
es el nombre del contenedor creado ...)En el caso de OP, asegúrese de que la imagen del acoplador se ejecute primero ejecutando el siguiente comando:
Luego, ejecute el contenedor acoplable con el siguiente comando:
fuente
Para Mac:
si quieres conectarte como usuario root:
fuente
Respuesta simple: comenzar y adjuntar al mismo tiempo. En este caso, está haciendo exactamente lo que pidió.
asegúrate de cambiar
<CONTAINER_ID/CONTAINER_NAME>
fuente
Ex:
fuente
Estoy ejecutando el contenedor de Windows y necesito buscar dentro del contenedor de la ventana acoplable los archivos y carpetas creados y copiados.
Para hacer eso, utilicé el siguiente comando docker entrypoint para que el símbolo del sistema se ejecute dentro del contenedor o se adjunte al contenedor.
Eso me ayudó tanto al símbolo del sistema adjuntar al contenedor como a mantener vivo el contenedor. :)
fuente
Una forma rápida de reanudar y acceder al contenedor salido más recientemente:
fuente
Usualmente uso esto:
para interactuar continuamente con un contenedor en ejecución.
fuente