Creé un contenedor con -dlo 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 runcon un contenedor, pero eso no parece estar permitido. El uso startsimplemente 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 -aRespuestas:
En octubre de 2014, el equipo de Docker introdujo el
docker execcomando : 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
execcomando 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
-dopció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 LDNacdrevpara 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:
-iMantenga STDIN abierto incluso si no está conectado.-tAsignar un pseudo-TTY.Entonces su nuevo
runcomando es:Si desea adjuntar a un contenedor que ya se está ejecutando:
En estos ejemplos
/bin/bashse 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?-itno 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á
commithacerlo en una imagen. Luego puede iniciar bash en la nueva imagen:fuente
dshellpara 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
commitel contenedor a una imagen yruncon un comando diferente.Consulte https://forums.docker.com/t/run-command-in-stopped-container/343
(creo que el
ENTRYPOINTenfoque " con argumentos" tampoco funcionaría, ya que aún no podría cambiar el argumentos a un contenedor detenido.)fuente
bin/bashsin-itno 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í,commites 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
giten ese contenedor utilizando lapacmanherramienta: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
-tpara 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/bashsaldrá inmediatamente en modo demonio (-d). Si desea que este contenedor ejecute un shell interactivo, use en-itlugar de-d. Si desea ejecutar comandos arbitrarios en un contenedor que generalmente ejecuta otro proceso, puede intentarlonsenteronsinit. Eche un vistazo a https://blog.codecentric.de/en/2014/07/enter-docker-container/ para más detalles.fuente
Lamentablemente, es imposible anular
ENTRYPOINTcon argumentosdocker run --entrypointpara 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 runes 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_bardeenes 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