¿Cómo edito un archivo después de convertir un contenedor Docker?

518

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?

Igor Barinov
fuente
@Opal uso confluent / postgres-bw: 0.1
Igor Barinov
2
@Opal apt-get install vim funciona. ¡Gracias!
Igor Barinov
3
Entonces, ¿por qué no crear Dockerfilee incluir el comando apt-get install y generar su propio contenedor? El contenedor Docker está diseñado así, no a tu manera.
BMW
1
docker debería instalarse al menos en el editor de prueba, al menos vim por defecto
Bawantha

Respuestas:

727

Como en los comentarios, no hay un editor predeterminado establecido, extraño, la $EDITORvariable de entorno 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 publicación sobre el tema.

Ópalo
fuente
3
Lo que necesita es montar un volumen: docs.docker.com/userguide/dockervolumes
Opal
16
Necesitaba iniciar sesión como root para hacer esto docker exec -u 0 -it container_name bash.
Eng.Fouad
34
Al igual que con Docker, mejor instalarlo vim-tiny, probablemente.
ryenus
2
Tal vez podría considerar no instalar un editor en cada contenedor al que se adjunte, sino solo una vez en la máquina host del acoplador. Como otros comentaristas mencionaron, puede montar el volumen, para que pueda editar los archivos que se van a montar, o navegar a los datos del contenedor y editar los archivos en/var/lib/docker/
Pitt
44
Solo quería cambiar una configuración de verdadero a falso en el contenedor. apt-getno funcionaba debido a un problema de permiso dentro del contenedor, así que lo intenté sed -i 's/texttobechanged/textwanted/g' filename. Funcionó para mi.
Amreesh Tyagi
422

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.

hkong
fuente
21
@Igor Esta debería ser la solución aceptada, ya que es la forma correcta de hacerlo sin agregar paquetes adicionales a su contenedor, mientras que agregar paquetes debería ser una solución secundaria.
Routhinator
1
Para plataformas Windows, puede usar, por ejemplo: docker cp <container>:C:\inetpub\wwwroot\Web.config .y docker cp Web.config <container>:C:\inetpub\wwwroot\Web.config.
Rosberg Linhares
1
¡Buena solución para el propósito de la prueba! No recomiendo hacerlo en producción.
Michal Šípek
99
¿Y qué recomiendas para la producción? ¿Debería la gente editar archivos en un contenedor interactivamente en producción?
lucid_dreamer
44
Vale la pena señalar que este método cambia la propiedad del archivo. Es posible pero un poco complicado cambiarlo nuevamente yendo al contenedor como root ( docker exec -u 0 -it mycontainer bash) y luego ejecutando un chowncomando.
Steve Chambers
91

Puede usarlo catsi está instalado, lo que probablemente sea el caso si no es un contenedor desnudo / sin procesar. 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

catgenerará 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 SIGINTgato para que salga con gracia. En los comentarios, verá que también puede presionar ctrl-d para indicar el final del archivo ("no se reciben más entradas").

Otra opción es algo así como infilterque inyecta un proceso en el espacio de nombres del contenedor con algo de magia de traza: https://github.com/yadutaf/infilter

meijsermans
fuente
3
¡Esto es increíblemente útil si hay problemas de permiso de instilación!
Romano
17
ctrl+Des mejor que ctrl+C. ctrl+Denvía un EOF. No es necesario agregar una nueva línea adicional al final. Con ctrl+C, si olvida agregar la nueva línea, ¡perderá la última línea!
wisbucky
1
@wisbucky ¡Bien! Aun mejor. Sin embargo, podría necesitar ctrl-d dos veces.
meijsermans
52

Para mantener sus imágenes Docker pequeñas, 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
Mateo
fuente
2
Gracias. Quería dejar este enlace que explica mejor el vim scp:// vim.wikia . Además, para obtener la dirección IP de su contenedor, puede usarsudo docker inspect <container_id> | grep "IPAddress"
aJetHorn el
1
Solo me pregunto, ¿uso literalmente "remoteuser" o "docker"? Lo he intentado: vim scp://[email protected]//data/gitea/conf/app.iniasí como vim scp://[email protected]//data/gitea/conf/app.iniy ambos crean un nuevo archivo en blanco.
J. Scott Elblein
1
@ J.ScottElblein Esto requiere configurar sshprimero en su contenedor acoplable. Ver blog.softwaremill.com/… . Pero generalmente no desea instalar sshen su contenedor.
wisbucky
14

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
Yan
fuente
7

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.

ynux
fuente
6

Después de bombardear el contenedor Docker, simplemente escriba:

apt-get update
apt-get install nano
Dos
fuente
6

Puede abrir el archivo existente con

cat filename.extension

y copie todo el texto existente en el portapapeles.

Luego elimine el archivo antiguo con

rm filename.extension

o renombrar archivo antiguo con

mv old-filename.extension new-filename.extension

Crear nuevo archivo con

cat > new-file.extension

Luego pegue todo el texto copiado en el portapapeles, presione Entery salga con guardar presionando ctrl+z. Y listo, no es necesario instalar ningún tipo de editores.

xD3ath
fuente
5

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
David Dehghan
fuente
1
¿Cómo responde eso a la pregunta? - "¿Cómo edito archivos?"
Peter Mortensen
4

Para las operaciones de edición comunes, prefiero instalar vi( vim-tiny ), que usa solo 1491 kB o nanoque usa 1707 kB .

Por otro lado vimutiliza 28.9 MB .

Tenemos que recordar que para apt-get installpoder trabajar, tenemos que hacerlo updatela primera vez, entonces:

apt-get update
apt-get install vim-tiny

Para iniciar el editor en CLI necesitamos ingresar vi.

simhumileco
fuente
2

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 exity volver al contenedor

  • Vaya a la ubicación del archivo y vímalo vim file.txt

Aidar Gatin
fuente
1

Es un poco complicado, pero en un apuro puedes usar sedo awkhacer pequeñas ediciones o eliminar texto. Tenga cuidado con sus objetivos de expresiones regulares, por supuesto, y tenga en cuenta que es probable que esté rooten 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

(Más)

bbeecher
fuente
1

Una manera fácil de editar algunas líneas sería:

echo "deb http://deb.debian.org/debian stretch main" > sources.list
Saubhagya Srivastava
fuente
1

Vea el archivo de edición de la pregunta de desbordamiento de pila en su lugar

Sería una buena opción aquí, si:

  1. Para modificar un archivo grande, es imposible de usar cat.
  2. Instalar Vim no está permitido o tarda demasiado. Mi situación está utilizando la imagen de MySQL 5.7 cuando quiero cambiar el my.cnfarchivo, no hay es vim, viy Vim instalar tarda demasiado tiempo (China Gran Firewall). sedse proporciona en la imagen, y es bastante simple. Mi uso es como

    sed -i /s/testtobechanged/textwanted/g filename

    Use man sedo busque otros tutoriales para un uso más complejo.

Shihe Zhang
fuente
1

Se puede usar catsi está instalado, con el >caracter. Aquí está la manipulación:

cat > file_to_edit
#1 Write or Paste you text
#2 don't forget to leave a blank line at the end of file
#3 Ctrl + C to apply configuration

Ahora puedes ver el resultado con el comando

cat file
dero
fuente
0

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.

MaxiReglisse
fuente