Tengo un contenedor que ejecuta el servicio Apache en primer plano. Me gustaría poder acceder al contenedor desde otro shell para "hurgar" dentro de él y examinar los archivos. Por el momento, si me adjunto al contenedor, me queda mirando el demonio Apache y no puedo ejecutar ningún comando.
¿Es posible adjuntar otro tty a un contenedor en ejecución? Posiblemente, ¿puedo aprovechar el hecho de que Docker en realidad solo está envolviendo contenedores LXC? Lo he intentado sudo lxc-console -n [container-id] -t [1-4]
pero parece que solo hay un tty disponible y ese es el que ejecuta el demonio apache. ¿Quizás haya una manera de habilitar varias consolas lxc durante la compilación?
Prefiero no configurar y construir el contenedor con un servicio openssh si es posible.
docker attach [conainer-id]
?Respuestas:
Con docker 1.3, hay un nuevo comando
docker exec
. Esto le permite ingresar a una ventana acoplable en ejecución:fuente
exec
no actúa como un terminal normal. Por ejemplo, no puede cambiar de usuario una vez dentro del contenedor.su someuser
cambiar de usuario. Ejecutando Docker 1.4.1docker exec -it
que eventualmente proporcionará un pseudo tty completamente funcional, pero por ahora (Docker versión 1.9.1), hay algunas deficiencias: github.com/docker/docker/issues/8755Debe usar la herramienta de Jérôme Petazzoni llamada 'nsenter' para ingresar a un contenedor sin usar SSH. Ver: https://github.com/jpetazzo/nsenter
Instalar simplemente ejecutando:
docker run -v /usr/local/bin:/target jpetazzo/nsenter
Luego use el comando
docker-enter <container-id>
para ingresar al contenedor.fuente
docker exec
. Esto le permite ingresar a una ventana acoplable en ejecución:docker exec -it <container-id> bash
(vea mi respuesta a continuación)docker-enter
Todavía existe? Me dacommand not found
.Actualizar
A partir de docker 0.9, para que los pasos a continuación funcionen, ahora uno tiene que actualizar el
/etc/default/docker
archivo con la'-e lxc'
opción de inicio de docker daemon antes de reiniciar el demonio (hice esto reiniciando el host).Todo esto es porque ...
fuente
Tenga en cuenta que esto evitará que la nueva función opcional de conexión en red de solo host del docker 0.11 "funcione" y solo verá la interfaz de bucle invertido. informe de error
Resulta que la solución a una pregunta diferente también fue la solución a esta:
Actualización: pronto tendrá que usar en
ps --no-trunc
lugar de lops -notrunc
que está en desuso.Encuentra la ID del contenedor completo
Ingrese el comando adjunto lxc.
Arriba muestra mi proceso de apache ejecutándose que inició Docker.
fuente
Primer paso para obtener la identificación del contenedor:
docker ps
Esto te mostrará algo como
1170fe9e9460
es la identificación del contenedor en este caso.En segundo lugar , ingrese a la ventana acoplable:
docker exec -it [container_id] bash
entonces en el caso anterior:
docker exec -it 1170fe9e9460 bash
fuente
¿Qué pasa con ejecutar tmux / GNU Screen dentro del contenedor? Parece la forma más sencilla de acceder a tantos vty como desee con un simple:
fuente
docker attach
y señalé que:...the attach command attaches to the running tty, not a new one, hence the question title is "...with new TTY"
nsenter
hace eso. Sin embargo, también necesitaba ingresar a un contenedor de una manera simple y nsenter no era suficiente para mis necesidades. Estaba defectuoso en algunas ocasiones (la pantalla negra más la bandera -wd no funcionaban) Además, quería iniciar sesión como usuario específico y en un directorio específico.Terminé haciendo mi propia herramienta para ingresar contenedores. Puede encontrarlo en: https://github.com/Pithikos/docker-enter
Su uso es tan fácil como
fuente
La forma "nsinit" es:
instalar nsinit
desde el interior del contenedor:
desde afuera:
úsalo
fuente
Te llevará a la consola de contenedores.
fuente
fuente
Comencé powershell en un microsoft / iis run como daemon usando
fuente
En Windows 10 , tengo docker instalado. Estoy ejecutando Jnekins en un contenedor y encontré el mismo mensaje de error. Aquí hay una guía paso a paso para resolver este problema:
Paso 1: Abra gitbash y ejecute docker run -p 8080: 8080 -p 50000: 50000 jenkins.
Paso 2: abre una nueva terminal.
Paso 3: Haz "docker ps" para obtener una lista del contenedor en ejecución. Copie la identificación del contenedor.
Paso 4: Ahora, si haces "docker exec -it {container id} sh" o "docker exec -it {container id} bash", recibirás un mensaje de error similar a "el dispositivo de entrada no es un TTY. Si eres usando mintty, intente anteponer el comando con 'winpty' "
Paso 5: Ejecute el comando " $ winpty docker exec -it {container id} sh "
vola !! Ahora estás dentro de la terminal.
fuente