Come posso modificare un file dopo averlo shell su un contenitore Docker?


518

Ho sgusciato con successo su un contenitore Docker usando:

docker exec -i -t 69f1711a205e bash

Ora devo modificare il file e non ho editor all'interno:

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:/#

Come posso modificare i file?


@Opal Uso confluent / postgres-bw: 0.1
Igor Barinov

2
@Opal apt-get install vim funziona. Grazie!
Igor Barinov,

3
quindi perché non creare il Dockerfilecomando include apt-get install e generare il proprio contenitore? Il contenitore Docker è progettato in questo modo, non a modo tuo.
BMW

1
la finestra mobile dovrebbe essere installata in leasing sull'editor di test, almeno vim per impostazione predefinita
Bawantha,

Risposte:


727

Come nei commenti, non esiste un set di editor predefinito - strano - la $EDITORvariabile di ambiente è vuota. Puoi accedere in un contenitore con:

docker exec -it <container> bash

E corri:

apt-get update
apt-get install vim

O utilizzare il seguente Dockerfile:

FROM  confluent/postgres-bw:0.1

RUN ["apt-get", "update"]
RUN ["apt-get", "install", "-y", "vim"]

Le immagini Docker vengono consegnate ridotte al minimo indispensabile, quindi nessun editor è installato con il container spedito. Ecco perché è necessario installarlo manualmente.

MODIFICARE

Ti incoraggio anche a leggere il mio post sull'argomento.


3
Ciò di cui hai bisogno è montare un volume: docs.docker.com/userguide/dockervolumes
Opal

16
Ho dovuto accedere come root per farlo docker exec -u 0 -it container_name bash.
Ing

34
Come con la finestra mobile, è meglio installare vim-tinyinvece, probabilmente.
reno

2
Forse potresti considerare di non installare un editor in ciascun contenitore a cui ti allego, ma piuttosto una sola volta sulla macchina host docker. Come altri commentatori hanno menzionato, puoi montare il volume, in modo da poter modificare i file che verranno montati, oppure navigare ai dati del contenitore stesso e modificare i file in/var/lib/docker/
Pitt

4
Volevo solo cambiare una configurazione da vera a falsa nel contenitore. apt-getnon funzionava a causa di un problema di autorizzazione all'interno del contenitore, quindi ho provato sed -i 's/texttobechanged/textwanted/g' filename. Ha funzionato per me.
Amreesh Tyagi,

422

Se non desideri aggiungere un editor solo per apportare alcune piccole modifiche (ad esempio, modificare la configurazione di Tomcat), puoi semplicemente utilizzare:

docker cp <container>:/path/to/file.ext .

che lo copia sul computer locale (nella directory corrente). Quindi modifica il file localmente utilizzando il tuo editor preferito, quindi esegui un

docker cp file.ext <container>:/path/to/file.ext

per sostituire il vecchio file.


21
@Igor Questa dovrebbe essere effettivamente la soluzione accettata in quanto è il modo corretto di farlo senza aggiungere ulteriori pacchetti al proprio contenitore, mentre l'aggiunta di pacchetti dovrebbe essere una soluzione secondaria.
Routhinator,

1
Per le piattaforme Windows, è possibile utilizzare, ad esempio: docker cp <container>:C:\inetpub\wwwroot\Web.config .e docker cp Web.config <container>:C:\inetpub\wwwroot\Web.config.
Rosberg Linhares,

1
Bella soluzione alternativa ai fini del test! Non consiglio di farlo in produzione.
Michal Šípek

9
E cosa mi consigliate per la produzione? Le persone dovrebbero modificare i file in un contenitore in modo interattivo durante la produzione?
lucid_dreamer,

4
Vale la pena notare che questo metodo modifica la proprietà del file. È possibile ma un po 'complicato cambiarlo in seguito andando nel contenitore come root ( docker exec -u 0 -it mycontainer bash) e quindi eseguendo un chowncomando.
Steve Chambers,

91

Puoi usarlo catse è installato, il che sarà probabilmente il caso se non è un contenitore nudo / grezzo. Funziona in modo semplicissimo e va bene quando copia + incolla su un editor appropriato localmente.

cat > file
# 1. type in your content
# 2. leave a newline at end of file
# 3. ctrl-c / (better: ctrl-d)
cat file

catprodurrà ciascuna riga alla ricezione di una nuova riga. Assicurati di aggiungere una nuova riga per l'ultima riga. ctrl-c invia a SIGINTfor cat per uscire con garbo. Dai commenti vedi che puoi anche premere ctrl-d per indicare la fine del file ("nessun altro input in arrivo").

Un'altra opzione è quella infilterche inietta un processo nello spazio dei nomi del contenitore con un po 'di magia ptrace: https://github.com/yadutaf/infilter


3
Questo è così incredibilmente utile se ci sono problemi di permesso di instillazione!
Romano,

17
ctrl+Dè meglio di ctrl+C. ctrl+Dinvia un EOF. Non è necessario aggiungere una nuova riga aggiuntiva alla fine. Con ctrl+C, se dimentichi di aggiungere la nuova riga, perderai l'ultima riga!
Wisbucky,

1
@wisbucky Nice! Anche meglio. Potrebbe aver bisogno di ctrl-d due volte però.
Meijsermans,

52

Per mantenere piccole le immagini Docker, non installare editor non necessari. È possibile modificare i file su SSH dall'host Docker al contenitore:

vim scp://remoteuser@containerip//path/to/document

2
Grazie. Volevo lasciare questo link che spiega meglio la vim scp:// vim.wikia . Inoltre, per ottenere l'indirizzo IP del tuo contenitore, puoi usaresudo docker inspect <container_id> | grep "IPAddress"
aJetHorn il

1
Mi chiedo, uso letteralmente "remoteuser" o "docker"? Ho provato: vim scp://docker@172.17.0.17//data/gitea/conf/app.inicosì come vim scp://remoteuser@172.17.0.17//data/gitea/conf/app.inied entrambi creano solo un nuovo file vuoto.
J. Scott Elblein,

1
@ J.ScottElblein Questo richiede prima la configurazione sshsul contenitore della finestra mobile. Vedi blog.softwaremill.com/… . Ma in genere non si desidera installare sshnel contenitore.
Wisbucky

14

A volte devi prima eseguire il contenitore con root:

docker exec -ti --user root <container-id> /bin/bash

Quindi nel contenitore, per installare Vim o qualcos'altro:

apt-get install vim

7

Uso "docker run" (non "docker exec") e mi trovo in una zona riservata dove non è possibile installare un editor. Ma ho un editor sull'host Docker.

La mia soluzione è: legare montare un volume dall'host Docker al contenitore ( https://docs.docker.com/engine/reference/run/#/volume-shared-filesystems ) e modificare il file all'esterno del contenitore. Sembra così:

docker run -v /outside/dir:/container/dir

Questo è principalmente per sperimentare, e in seguito cambierei il file quando creo l'immagine.


6

Dopo aver bombardato il contenitore Docker, basta digitare:

apt-get update
apt-get install nano

6

È possibile aprire il file esistente con

cat filename.extension

e copia tutto il testo esistente negli Appunti.

Quindi eliminare il vecchio file con

rm filename.extension

o rinominare il vecchio file con

mv old-filename.extension new-filename.extension

Crea un nuovo file con

cat > new-file.extension

Quindi incolla tutto il testo copiato negli appunti, premi Entered esci con il salvataggio premendo ctrl+z. E voilà non è necessario installare alcun tipo di editor.


5

Puoi semplicemente modificare il tuo file sull'host e copiarlo rapidamente ed eseguirlo all'interno del contenitore. Ecco il mio collegamento di una riga per copiare ed eseguire un file Python:

docker cp main.py my-container:/data/scripts/ ; docker exec -it my-container python /data/scripts/main.py

1
Come risponde alla domanda? - "Come posso modificare i file?"
Peter Mortensen,

4

Per le operazioni di modifica comuni preferisco installare vi( vim-tiny ), che utilizza solo 1491 kB o nanoche utilizza 1707 kB .

D'altra parte vimutilizza 28,9 MB .

Dobbiamo ricordare che per apt-get installfunzionare dobbiamo fare updatela prima volta, quindi:

apt-get update
apt-get install vim-tiny

Per avviare l'editor nella CLI dobbiamo inserire vi.


2

Se si utilizza il contenitore di Windows e si desidera modificare qualsiasi file, è possibile ottenere e utilizzare facilmente Vim nella console di Powershell.

Per eseguire lo shelling nel contenitore Docker di Windows con PowerShell:

docker exec -it <name> powershell

  • Prima installa il gestore di pacchetti Chocolatey

    Invoke-WebRequest https://chocolatey.org/install.ps1 -UseBasicParsing | Invoke-Expression;

  • Installa Vim

    choco install vim

  • Aggiorna VARIABILE AMBIENTALE Puoi semplicemente exittornare indietro nel contenitore

  • Vai al percorso del file e Vim vim file.txt


1

È un po 'complicato, ma in un pizzico puoi usare sedo awkper fare piccole modifiche o rimuovere il testo. Stai attento con i tuoi obiettivi regex ovviamente e tieni presente che probabilmente sei rootnel tuo contenitore e potresti dover modificare le autorizzazioni.

Ad esempio, la rimozione di una riga completa che contiene testo corrispondente a una regex:

awk '!/targetText/' file.txt > temp && mv temp file.txt

(Di Più)


1

Un modo semplice per modificare alcune righe sarebbe:

echo "deb http://deb.debian.org/debian stretch main" > sources.list

1

Vedi domanda Stack Overflow sed file di modifica in atto

Sarebbe una buona opzione qui, se:

  1. Per modificare un file di grandi dimensioni, è impossibile da usare cat.
  2. Installare Vim non è consentito o richiede troppo tempo. La mia situazione sta usando l'immagine di MySQL 5.7, quando voglio cambiare il my.cnffile non esiste vim, vie Vim installare richiede troppo tempo (China Great Firewall). sedè fornito nell'immagine ed è abbastanza semplice. Il mio utilizzo è come

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

    Utilizzare man sedo cercare altri tutorial per un utilizzo più complesso.


1

È possibile utilizzare catse installato, con il >carattere. Ecco la manipolazione:

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

Ora puoi vedere il risultato con il comando

cat file

0

Puoi anche usare un contenitore speciale che conterrà solo il comando di cui hai bisogno: Vim. Ho scelto Python-Vim . Si presuppone che i dati che si desidera modificare siano in un contenitore di dati creato con il seguente 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"]

Sarai in grado di modificare i tuoi dati montando un volume Docker (src_volume) che sarà condiviso dal tuo contenitore di dati (src_data) e dal contenitore 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

In questo modo, non cambi i tuoi contenitori. Basta usare un contenitore speciale per questo lavoro.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.