modificar imagen ejemplos copiar contenedor archivos bash docker

bash - imagen - dockerfile ejemplos



Cómo editar archivos en el contenedor docker detenido/no iniciado (3)

Tratando de corregir errores y problemas de depuración con mi aplicación que se divide en varios contenedores, edito frecuentemente archivos en contenedores:

  • o soy totalmente vago e instalo nano y edito directamente en el contenedor o

  • Docker recojo el archivo del contenedor, lo edito, lo copio y reinicio el contenedor

Esos son pasos intermedios antes de llegar al nuevo contenido para la compilación del contenedor, que lleva mucho más tiempo que hacer lo anterior (que, por supuesto, solo es intermedio / complicado).

Ahora, frecuentemente 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 por errores de sintaxis.

¿Hay alguna forma de guardar esos contenedores? Como no se inician, no puedo acoplarlos y, por lo tanto, me han perdido. Luego voy a 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 copiarlos o iniciar un shell en un contenedor detenido, algo que me permita arreglar este contenedor?

(Parece un poco como trabajar en una computadora remota y romper la configuración de red: la conexión se pierde "para siempre" de esta manera y uno tiene que usar un recurso alternativo, si es que existe).

¿Cómo editar los archivos del contenedor Docker desde el host? parece relevante pero está desactualizado.


Puede editar el sistema de archivos contenedor directamente, pero no sé si es una buena idea. Primero necesita encontrar la ruta del directorio que se utiliza como raíz de tiempo de ejecución para el contenedor. Ejecute el docker container inspect id/name . Busque la clave UpperDir en la salida JSON.

Ese es tu directorio.


Respondiendo a mi propia pregunta ... ¡aún 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 nodo o lo que sea que fuera antes).

Más detalles:

1) Usando

docker ps

para encontrar los contenedores en ejecución o

docker ps -a

para encontrar todos los contenedores (incluidos los detenidos) y

docker inspect (containername)

busque el "Id", uno de los primeros valores.

Esta es la parte que contiene detalles de implementación y puede cambiar, tenga en cuenta que puede perder su contenedor de esta manera.

Ir

/var/lib/docker/aufs/diff/9bc343a9..(long container id)/

y allí encontrará todos los archivos que se cambian hacia la imagen en la que se basa el contenedor. Puede sobrescribir archivos, agregar o editar archivos.

De nuevo, no recomendaría esto.

2) Como se describe en https://.com/a/32353134/586754 , puede encontrar la configuración json config.json en una ruta como

/var/lib/docker/containers/9bc343a99..(long container id)/config.json

Allí puede cambiar los argumentos de, por ejemplo, "nodejs app.js" a "/ bin / bash". Ahora reinicie el servicio acoplable e inicie el contenedor (debería ver que ahora se inicia correctamente). Deberías usar

docker start -i (containername)

para asegurarse de que no se detenga de inmediato. Ahora puede trabajar con el contenedor y / o luego adjuntar 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, uno solo debería 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.


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:

docker cp docker_web_1:/etc/apache2/sites-enabled/apache2.conf .

(corrija el archivo)

docker cp apache.conf docker_web_1:/etc/apache2/sites-enabled/apache2.conf