crear - ¿Cómo edito un archivo después de convertirlo en un contenedor Docker?
crear contenedor docker (14)
Como en los comentarios, no hay un conjunto de editor predeterminado, extraño, la
$EDITOR
entorno
$EDITOR
está vacía.
Puede iniciar sesión en un contenedor con:
docker exec -it <container> bash
Y correr:
apt-get update
apt-get install vim
O use el siguiente Dockerfile:
FROM confluent/postgres-bw:0.1
RUN ["apt-get", "update"]
RUN ["apt-get", "install", "-y", "vim"]
Las imágenes de Docker se entregan recortadas al mínimo, por lo que no se instala ningún editor con el contenedor enviado. Por eso es necesario instalarlo manualmente.
EDITAR
También te animo a leer mi post sobre el tema.
Me desgrane con éxito a un contenedor Docker usando
docker exec -i -t 69f1711a205e bash
Ahora necesito editar el archivo y no tengo editores adentro:
root@69f1711a205e:/# nano
bash: nano: command not found
root@69f1711a205e:/# pico
bash: pico: command not found
root@69f1711a205e:/# vi
bash: vi: command not found
root@69f1711a205e:/# vim
bash: vim: command not found
root@69f1711a205e:/# emacs
bash: emacs: command not found
root@69f1711a205e:/#
¿Cómo edito archivos?
Después de bombardear el contenedor Docker, simplemente escriba:
apt-get update
apt-get install nano
En algún momento primero debe ejecutar el contenedor con
root
:
docker exec -ti --user root <container-id> /bin/bash
Luego, en el contenedor, para instalar Vim o algo más:
apt-get install vim
Es un poco complicado, pero en un apuro puedes usar
sed
o
awk
para hacer pequeñas ediciones o eliminar texto.
Tenga cuidado con sus objetivos de expresiones regulares, por supuesto, y tenga en cuenta que es probable que
root
en su contenedor y que tenga que reajustar los permisos.
Por ejemplo, eliminar una línea completa que contiene texto que coincide con una expresión regular:
awk ''!/targetText/'' file.txt > temp && mv temp file.txt
(More)
Para las operaciones de edición comunes, prefiero instalar
vi
(
vim-tiny
), que usa solo
1491 kB
o
nano
que usa
1707 kB
.
Por otro lado,
vim
usa
28.9 MB
.
Tenemos que recordar que para que
apt-get install
funcione, tenemos que hacer la
update
la primera vez, así que:
apt-get update
apt-get install vim-tiny
Para iniciar el editor en
CLI
necesitamos ingresar
vi
.
Para mantener pequeñas las imágenes de Docker, no instale editores innecesarios. Puede editar los archivos a través de SSH desde el host Docker al contenedor:
vim scp://remoteuser@containerip//path/to/document
Puede editar su archivo en el host y copiarlo rápidamente y ejecutarlo dentro del contenedor. Aquí está mi acceso directo de una línea para copiar y ejecutar un archivo Python:
docker cp main.py my-container:/data/scripts/ ; docker exec -it my-container python /data/scripts/main.py
Puede usar
cat
si está instalado, lo que probablemente sea el caso si no es un contenedor desnudo / crudo.
Funciona en un apuro, y está bien cuando copia + pega a un editor apropiado localmente.
cat > file
# 1. type in your content
# 2. leave a newline at end of file
# 3. ctrl-c / (better: ctrl-d)
cat file
cat
generará cada línea al recibir una nueva línea.
Asegúrese de agregar una nueva línea para esa última línea.
ctrl-c envía un
SIGINT
para que cat salga con gracia.
En los comentarios, verá que también puede presionar ctrl-d para denotar el final del archivo ("no se reciben más entradas").
Otra opción es algo así como
infilter
que inyecta un proceso en el espacio de nombres del contenedor con algo de magia ptrace:
https://github.com/yadutaf/infilter
Si no desea agregar un editor solo para hacer algunos pequeños cambios (por ejemplo, cambiar la configuración de Tomcat), puede usar:
docker cp <container>:/path/to/file.ext .
que lo copia a su máquina local (a su directorio actual). Luego edite el archivo localmente con su editor favorito y luego haga un
docker cp file.ext <container>:/path/to/file.ext
para reemplazar el archivo viejo.
Si usa el contenedor de Windows y desea cambiar cualquier archivo, puede obtener y usar Vim en la consola Powershell fácilmente.
Para pelar al contenedor de Windows Docker con PowerShell:
docker exec -it <name> powershell
-
Primero instale el administrador de paquetes Chocolatey
Invoke-WebRequest https://chocolatey.org/install.ps1 -UseBasicParsing | Invoke-Expression;
-
Instalar Vim
choco install vim
-
Actualizar VARIABLE AMBIENTAL Puede simplemente
exit
y volver al contenedor -
Vaya a la ubicación del archivo y
vim file.txt
itvim file.txt
También puede usar un contenedor especial que contendrá solo el comando que necesita: Vim. Elegí python-vim . Se supone que los datos que desea editar están en un contenedor de datos creado con el siguiente Dockerfile:
FROM debian:jessie
ENV MY_USER_PASS my_user_pass
RUN groupadd --gid 1001 my_user
RUN useradd -ms /bin/bash --home /home/my_user /
-p $(echo "print crypt("${MY_USER_PASS:-password}", "salt")" | perl) /
--uid 1001 --gid 1001 my_user
ADD src /home/my_user/src
RUN chown -R my_user:my_user /home/my_user/src
RUN chmod u+x /home/my_user/src
CMD ["true"]
Podrá editar sus datos montando un volumen Docker (src_volume) que será compartido por su contenedor de datos (src_data) y el contenedor python-vim.
docker volume create --name src_volume
docker build -t src_data .
docker run -d -v src_volume:/home/my_user/src --name src_data_1 src_data
docker run --rm -it -v src_volume:/src fedeg/python-vim:latest
De esa manera, no cambia sus contenedores. Solo usa un contenedor especial para este trabajo.
Una manera fácil de editar algunas líneas sería:
echo "deb http://deb.debian.org/debian stretch main" > sources.list
Uso "docker run" (no "docker exec"), y estoy en una zona restringida donde no podemos instalar un editor. Pero tengo un editor en el host Docker.
Mi solución alternativa es: enlazar, montar un volumen desde el host Docker al contenedor ( https://docs.docker.com/engine/reference/run/#/volume-shared-filesystems ) y editar el archivo fuera del contenedor. Se parece a esto:
docker run -v /outside/dir:/container/dir
Esto es principalmente para experimentar, y luego cambiaría el archivo al construir la imagen.
Vea el archivo de edición de pregunta de desbordamiento de pila en su lugar
Sería una buena opción aquí, si:
-
Para modificar un archivo grande, es imposible usar
cat
. -
Instalar Vim no está permitido o tarda demasiado. Mi situación es usar la imagen MySQL 5.7 cuando quiero cambiar el archivo
my.cnf
, no hayvim
,vi
, y la instalación de Vim toma demasiado tiempo (China Great Firewall).sed
se proporciona en la imagen, y es bastante simple. Mi uso es comosed -i /s/testtobechanged/textwanted/g filename
Use
man sed
o busque otros tutoriales para un uso más complejo.