Wie bearbeite ich eine Datei, nachdem ich einen Docker-Container erstellt habe?

518

Ich habe erfolgreich in einen Docker-Container geschält, indem ich:

docker exec -i -t 69f1711a205e bash

Jetzt muss ich die Datei bearbeiten und habe keine Editoren mehr:

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

Wie bearbeite ich Dateien?

Igor Barinov
quelle
@Opal Ich benutze Confluent / Postgres-BW: 0.1
Igor Barinov
2
@Opal apt-get install vim funktioniert. Vielen Dank!
Igor Barinov
3
Warum also nicht den DockerfileBefehl und include apt-get install erstellen und einen eigenen Container generieren? Der Docker-Container ist so konzipiert, nicht wie Sie es möchten.
BMW
1
Docker sollte mindestens im
Testeditor

Antworten:

724

Wie in den Kommentaren ist kein Standardeditor festgelegt - seltsam - die $EDITORUmgebungsvariable ist leer. Sie können sich in einem Container anmelden mit:

docker exec -it <container> bash

Und Renn:

apt-get update
apt-get install vim

Oder verwenden Sie die folgende Docker-Datei:

FROM  confluent/postgres-bw:0.1

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

Docker-Images werden auf das Nötigste zugeschnitten geliefert - daher wird kein Editor mit dem ausgelieferten Container installiert. Aus diesem Grund muss es manuell installiert werden.

BEARBEITEN

Ich ermutige Sie auch, meinen Beitrag zum Thema zu lesen .

Opal
quelle
3
Was Sie brauchen, ist das Mounten eines Volumes: docs.docker.com/userguide/dockervolumes
Opal
16
Ich musste mich als Root anmelden, um dies zu erreichen docker exec -u 0 -it container_name bash.
Eng.Fouad
34
Wie bei Docker ist es vim-tinywahrscheinlich besser, stattdessen zu installieren .
Ryenus
2
Vielleicht könnten Sie nicht in jedem Container, an den Sie sich anschließen, einen Editor installieren, sondern nur einmal auf dem Docker-Host-Computer. Wie andere Kommentatoren bereits erwähnt haben, können Sie das Volume bereitstellen, um die Dateien zu bearbeiten, die bereitgestellt werden sollen, oder zu den Containerdaten selbst navigieren und die Dateien in/var/lib/docker/
Pitt
4
Ich wollte nur eine Konfiguration im Container von true in false ändern. apt-getfunktionierte aufgrund eines Berechtigungsproblems im Container nicht, also habe ich es versucht sed -i 's/texttobechanged/textwanted/g' filename. Es hat bei mir funktioniert.
Amreesh Tyagi
420

Wenn Sie keinen Editor hinzufügen möchten, um nur ein paar kleine Änderungen vorzunehmen (z. B. die Tomcat-Konfiguration zu ändern), können Sie einfach Folgendes verwenden:

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

Dadurch wird es auf Ihren lokalen Computer (in Ihr aktuelles Verzeichnis) kopiert. Bearbeiten Sie dann die Datei lokal mit Ihrem bevorzugten Editor und führen Sie dann eine aus

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

um die alte Datei zu ersetzen.

hkong
quelle
21
@Igor Dies sollte tatsächlich die akzeptierte Lösung sein, da dies der richtige Weg ist, ohne zusätzliche Pakete zu Ihrem Container hinzuzufügen, während das Hinzufügen von Paketen eine sekundäre Lösung sein sollte.
Routhinator
1
Für Windows-Plattformen können Sie beispielsweise Folgendes verwenden: docker cp <container>:C:\inetpub\wwwroot\Web.config .und docker cp Web.config <container>:C:\inetpub\wwwroot\Web.config.
Rosberg Linhares
1
Gute Lösung für den Testzweck! Ich empfehle es nicht in der Produktion.
Michal Šípek
9
Und was empfehlen Sie für die Produktion? Sollten Benutzer Dateien in einem Container interaktiv in der Produktion bearbeiten?
lucid_dreamer
4
Bemerkenswert ist, dass diese Methode den Dateieigentum ändert. Es ist möglich, aber etwas umständlich, es später wieder zu ändern, indem Sie als root ( docker exec -u 0 -it mycontainer bash) in den Container gehen und dann einen chownBefehl ausführen.
Steve Chambers
91

Sie können es verwenden, catwenn es installiert ist. Dies ist höchstwahrscheinlich der Fall, wenn es sich nicht um einen bloßen / rohen Container handelt. Es funktioniert zur Not und ist in Ordnung, wenn Sie es lokal in einen geeigneten Editor kopieren und einfügen.

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

catgibt jede Zeile beim Empfang einer neuen Zeile aus. Stellen Sie sicher, dass Sie für diese letzte Zeile eine neue Zeile hinzufügen. Strg-C sendet eine SIGINTfor-Katze, um sie ordnungsgemäß zu beenden . Aus den Kommentaren geht hervor, dass Sie auch Strg-D drücken können, um das Dateiende zu kennzeichnen ("keine Eingabe mehr").

Eine andere Option ist so etwas wie infilterdas Einfügen eines Prozesses in den Containernamensraum mit etwas Ptrace-Magie: https://github.com/yadutaf/infilter

Meijsermans
quelle
3
Dies ist unglaublich nützlich, wenn es Probleme mit der Instillationsberechtigung gibt!
Roman
17
ctrl+Dist besser als ctrl+C. ctrl+Dsendet eine EOF. Sie müssen am Ende keinen zusätzlichen Zeilenumbruch hinzufügen. Mit ctrl+Cvergessen , wenn Sie das Newline hinzufügen, werden Sie die letzte Zeile verlieren!
wisbucky
1
@wisbucky Schön! Noch besser. Möglicherweise müssen Sie jedoch zweimal Strg-D drücken.
Meijsermans
52

Installieren Sie keine unnötigen Editoren, um Ihre Docker-Images klein zu halten. Sie können die Dateien über SSH vom Docker-Host in den Container bearbeiten:

vim scp://remoteuser@containerip//path/to/document
Matthew
quelle
2
Vielen Dank. Ich wollte diesen Link verlassen, der die vim scp:// vim.wikia besser erklärt . Um die IP-Adresse Ihres Containers zu erhalten, können Sie auch verwendensudo docker inspect <container_id> | grep "IPAddress"
aJetHorn
1
Ich frage mich nur, ob ich buchstäblich "Remoteuser" oder "Docker" verwende. Ich habe versucht: vim scp://[email protected]//data/gitea/conf/app.inisowie vim scp://[email protected]//data/gitea/conf/app.iniund beide erstellen einfach eine neue, leere Datei.
J. Scott Elblein
1
@ J.ScottElblein Dies erfordert zuerst die Konfiguration sshauf Ihrem Docker-Container. Siehe blog.softwaremill.com/… . Im Allgemeinen möchten Sie jedoch nicht sshin Ihrem Container installieren .
wisbucky
14

Manchmal müssen Sie den Container zuerst ausführen mit root:

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

Dann in den Container, um Vim oder etwas anderes zu installieren:

apt-get install vim
Yan
quelle
7

Ich verwende "Docker Run" (nicht "Docker Exec") und bin in einer Sperrzone, in der wir keinen Editor installieren können. Aber ich habe einen Editor auf dem Docker-Host.

Meine Problemumgehung lautet: Binden Sie ein Volume vom Docker-Host an den Container ( https://docs.docker.com/engine/reference/run/#/volume-shared-filesystems ) und bearbeiten Sie die Datei außerhalb des Containers. Es sieht aus wie das:

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

Dies dient hauptsächlich zum Experimentieren. Später würde ich die Datei beim Erstellen des Bildes ändern.

ynux
quelle
6

Nachdem Sie den Docker-Container aufgerufen haben, geben Sie einfach Folgendes ein:

apt-get update
apt-get install nano
DOS
quelle
6

Sie können vorhandene Dateien mit öffnen

cat filename.extension

und kopieren Sie den gesamten vorhandenen Text in die Zwischenablage.

Dann löschen Sie die alte Datei mit

rm filename.extension

oder benenne alte Datei mit um

mv old-filename.extension new-filename.extension

Neue Datei erstellen mit

cat > new-file.extension

Fügen Sie dann den gesamten in die Zwischenablage kopierten Text ein, drücken Sie Enterund beenden Sie mit Speichern durch Drücken von ctrl+z. Und voila keine Notwendigkeit, irgendwelche Editoren zu installieren.

xD3ath
quelle
5

Sie können Ihre Datei einfach auf dem Host bearbeiten und schnell in den Container kopieren und dort ausführen. Hier ist meine einzeilige Verknüpfung zum Kopieren und Ausführen einer Python-Datei:

docker cp main.py my-container:/data/scripts/ ; docker exec -it my-container python /data/scripts/main.py
David Dehghan
quelle
1
Wie beantwortet das die Frage? - "Wie bearbeite ich Dateien?"
Peter Mortensen
4

Für gemeinsame Editieroperationen ziehe ich es installieren vi( vim-tiny ), die nur verwendet 1491 kB oder nanowelche verwendet 1707 kB .

In der anderen Hand vimverwendet 28,9 MB .

Wir müssen uns daran erinnern, dass apt-get installwir zum updateersten Mal das erste Mal arbeiten müssen, also:

apt-get update
apt-get install vim-tiny

So starten Sie den Editor in der CLI müssen wir eingeben vi.

simhumileco
quelle
2

Wenn Sie einen Windows-Container verwenden und eine beliebige Datei ändern möchten, können Sie Vim in der Powershell-Konsole problemlos herunterladen und verwenden.

So schalten Sie mit PowerShell in den Windows Docker-Container:

docker exec -it <name> powershell

  • Installieren Sie zuerst den Chocolatey-Paketmanager

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

  • Installieren Sie Vim

    choco install vim

  • UMWELTVARIABLE aktualisieren Sie können einfach exitund zurück zum Behälter schälen

  • Gehen Sie zum Dateispeicherort und Vim es vim file.txt

Aidar Gatin
quelle
1

Es ist eine Art verrückt, aber im Notfall können Sie verwenden , sedoder awkkleine Änderungen oder Entfernen von Text zu machen. Seien Sie natürlich vorsichtig mit Ihren Regex-Zielen und beachten Sie, dass Sie sich wahrscheinlich rootauf Ihrem Container befinden und möglicherweise die Berechtigungen neu anpassen müssen.

Entfernen Sie beispielsweise eine vollständige Zeile, die Text enthält, der einem regulären Ausdruck entspricht:

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

(Mehr)

bbeecher
quelle
1

Eine einfache Möglichkeit, einige Zeilen zu bearbeiten, wäre:

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

Siehe Frage zum Stapelüberlauf und zum Bearbeiten der Datei

Hier wäre es eine gute Option, wenn:

  1. Das Ändern einer großen Datei ist nicht möglich cat.
  2. Die Installation von Vim ist nicht zulässig oder dauert zu lange. Meine Situation ist das MySQL 5.7 Bild zu verwenden , wenn ich das ändern möge my.cnfDatei, gibt es keine vim, viund Vim installieren dauert lange (China Great Firewall). sedwird im Bild bereitgestellt, und es ist ganz einfach. Meine Nutzung ist wie

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

    Verwenden man sedoder suchen Sie nach anderen Tutorials für eine komplexere Verwendung.

Shihe Zhang
quelle
1

Sie können, catfalls installiert, mit dem >Zeichen verwenden. Hier ist die Manipulation:

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

Jetzt können Sie das Ergebnis mit dem Befehl sehen

cat file
dero
quelle
0

Sie können auch einen speziellen Container verwenden, der nur den Befehl enthält, den Sie benötigen: Vim. Ich habe mich für Python-Vim entschieden . Es wird davon ausgegangen, dass sich die Daten, die Sie bearbeiten möchten, in einem Datencontainer befinden, der mit der folgenden Docker-Datei erstellt wurde:

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"]

Sie können Ihre Daten bearbeiten, indem Sie ein Docker-Volume (src_volume) bereitstellen, das von Ihrem Datencontainer (src_data) und dem Python-Vim-Container gemeinsam genutzt wird.

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

Auf diese Weise ändern Sie Ihre Container nicht. Sie verwenden für diese Arbeit nur einen speziellen Behälter.

MaxiReglisse
quelle