Tratando de corregir errores y depurar problemas con mi aplicación que se divide en varios contenedores, con frecuencia edito archivos en contenedores:
o soy totalmente vago e instalo nano y edito directamente en el contenedor o
Docker cp el archivo fuera del contenedor, lo edito, lo copio y reinicio el contenedor
Esos son pasos intermedios antes de llegar a un nuevo contenido para la construcción de contenedores, lo que lleva mucho más tiempo que hacer lo anterior (que por supuesto es solo intermedio / jugueteo).
Ahora con frecuencia rompo el programa de inicio del contenedor, que en los casos de ruptura es un script de nodo o un script de servidor web Python, ambos generalmente fallan debido a errores de sintaxis.
¿Hay alguna forma de salvar esos contenedores? Dado que no se inician, no puedo insertar un ejecutivo en ellos y, por lo tanto, los pierdo. Luego voy por la ruta rm / rmi / build / run después de arreglar el archivo ofensivo en la entrada de compilación.
¿Cómo puedo editar archivos en un contenedor detenido, o ejecutarlos o iniciar un shell en un contenedor detenido, cualquier cosa que me permita arreglar este contenedor?
(Parece un poco como trabajar en una computadora remota y romper la configuración de la red: la conexión se pierde "para siempre" de esta manera y uno tiene que usar una alternativa, si existe).
¿Cómo editar archivos de contenedor de Docker desde el host? parece relevante pero está desactualizado.
docker cp
docker commit
comando para romper una nueva imagen.name=$(docker commit); docker run -it $name /bin/sh
harás lo que quieras.Respuestas:
Tuve un problema con un contenedor que no se iniciaba debido a un mal cambio de configuración que hice. Pude copiar el archivo del contenedor detenido y editarlo. algo como:
(corrige el archivo)
fuente
UpperDir
que obtienedocker container inspect
, tendría que experimentar para ver cómo el sistema de superposición representa los archivos en la estructura subyacente que se han eliminado en la capa superior.Respondiendo a mi propia pregunta ... ¡¡Todavía espero una mejor respuesta de una persona más conocedora !!
Hay 2 posibilidades.
1) Edición del sistema de archivos en el host directamente . Esto es algo peligroso y tiene la posibilidad de romper completamente el contenedor, posiblemente otros datos dependiendo de lo que salga mal.
2) Cambiar el script de inicio a algo que nunca falla, como iniciar un bash, hacer las correcciones / ediciones y luego cambiar el programa de inicio nuevamente al deseado (como el nodo o lo que fuera antes).
Más detalles:
1) Utilizando
para encontrar los contenedores en ejecución o
para encontrar todos los contenedores (incluidos los detenidos) y
busque el "Id", uno de los primeros valores.
Esta es la parte que contiene detalles de implementación y podría cambiar, tenga en cuenta que puede perder su contenedor de esta manera.
Ir
y allí encontrará todos los archivos que se cambiaron hacia la imagen en la que se basa el contenedor. Puede sobrescribir archivos, agregar o editar archivos.
Una vez más, no lo recomendaría.
2) Como se describe en https://stackoverflow.com/a/32353134/586754 , puede encontrar la configuración json config.json en una ruta como
Allí puede cambiar los argumentos de, por ejemplo, "nodejs app.js" a "/ bin / bash". Ahora reinicie el servicio Docker e inicie el contenedor (debería ver que ahora se inicia correctamente). Deberías usar
para asegurarse de que no se detenga de inmediato. Ahora puede trabajar con el contenedor y / o adjuntar posteriormente con
docker exec -ti (containername) /bin/bash
Además, docker cp es bastante útil para copiar archivos que se editaron fuera del contenedor.
Además, solo se debe recurrir a esas medidas si el contenedor está más o menos "perdido" de todos modos, por lo que cualquier cambio sería una mejora.
fuente
config.json
archivos cada vez que los editabaPuede editar el sistema de archivos del contenedor directamente, pero no sé si es una buena idea. Primero debe encontrar la ruta del directorio que se usa como raíz de tiempo de ejecución para el contenedor. Corre
docker container inspect id/name
. Busque la claveUpperDir
en la salida JSON.Ese es tu directorio.
fuente
Si está intentando reiniciar un contenedor detenido y necesita modificar el contenedor debido a una configuración incorrecta, pero el contenedor no se está iniciando, puede hacer lo siguiente, que funciona con el comando "docker cp" (similar a la sugerencia anterior). Este procedimiento le permite eliminar archivos y realizar cualquier otro cambio necesario. Con suerte, puede omitir muchos de los pasos siguientes.
Modificar o crear un nuevo script de punto de entrada, por ejemplo
#!/bin/bash tail -f /etc/hosts
fuente