Ich habe erfolgreich mit einem Docker-Container geschält
docker exec -i -t 69f1711a205e bash
Jetzt muss ich die Datei bearbeiten und ich habe keine Editoren darin:
[email protected]:/# nano
bash: nano: command not found
[email protected]:/# pico
bash: pico: command not found
[email protected]:/# vi
bash: vi: command not found
[email protected]:/# vim
bash: vim: command not found
[email protected]:/# emacs
bash: emacs: command not found
[email protected]1a205e:/#
Wie bearbeite ich Dateien?
Wie in den Kommentaren gibt es keinen Standardeditor - seltsam - die Umgebungsvariable $EDITOR
ist leer. Sie können sich in einen Container einloggen mit:
docker exec -it <container> bash
Und Renn:
apt-get update
apt-get install vim
Oder verwenden Sie die folgende Dockerfile:
FROM confluent/postgres-bw:0.1
RUN ["apt-get", "update"]
RUN ["apt-get", "install", "-y", "vim"]
Docker-Images werden auf das Nötigste geliefert - daher ist kein Editor mit dem gelieferten Container installiert. Deshalb muss es manuell installiert werden.
EDIT
Ich ermutige Sie auch, meine post zum Thema zu lesen.
Wenn Sie keinen Editor hinzufügen möchten, um nur ein paar kleine Änderungen vorzunehmen (z. B. die Tomcat-Konfiguration ändern), können Sie einfach Folgendes verwenden:
docker cp <container>:/path/to/file.ext .
die kopiert sie auf Ihren lokalen Rechner (in Ihr aktuelles Verzeichnis). Bearbeiten Sie die Datei dann 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.
Sie können cat
verwenden, wenn es installiert ist. Dies ist höchstwahrscheinlich der Fall, wenn es sich nicht um einen leeren/unformatierten Container handelt. Es funktioniert in einer Prise und in Ordnung, wenn Kopieren + Einfügen lokal in einen geeigneten Editor.
cat > file
# 1. type in your content
# 2. leave a newline at end of file
# 3. ctrl-c
cat file
cat
gibt jede Zeile aus, sobald eine neue Zeile empfangen wird. Stellen Sie sicher, dass Sie für diese letzte Zeile eine neue Zeile hinzufügen. ctrl-c sendet eine SIGINT
für die Katze, damit diese ordnungsgemäß beendet wird.
Eine andere Option ist etwas wie infilter
, das einen Prozess mit etwas Ptrace-Magie in den Container-Namespace einfügt: https://github.com/yadutaf/infilter
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://[email protected]//path/to/document
Irgendwann müssen Sie den Container zuerst mit root
ausführen:
docker exec -ti --user root <container-id> /bin/bash
Dann in den Container, um Vim oder etwas anderes zu installieren:
apt-get install vim
Ich verwende "docker run" (nicht "docker exec") und bin in einer eingeschränkten Zone, in der wir keinen Editor installieren können. Aber ich habe einen Editor auf dem Docker-Host.
Meine Problemumgehung ist: 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 der Kontainer. Es sieht aus wie das:
docker run -v /outside/dir:/container/dir
Dies ist hauptsächlich für Experimente gedacht, und später würde ich die Datei ändern, wenn Sie das Image erstellen.
Sie können Ihre Datei einfach auf dem Host bearbeiten und schnell in den Container kopieren und 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
Nachdem Sie den Docker-Container erstellt haben, geben Sie einfach Folgendes ein
apt-get update
apt-get install nano
Für allgemeine Bearbeitungsoperationen ziehe ich es vor, vi
( vim-tiny ) zu installieren, das nur 1491 kB oder nano
mit 1707 kB.
Andererseits verwendet vim
28,9 MB.
Wir müssen uns daran erinnern, dass wir, damit apt-get install
funktioniert, beim ersten Mal update
machen müssen, also:
apt-get update
apt-get install vim-tiny
Um den Editor in CLI zu starten, müssen wir vi
eingeben.
Siehe Stack Overflow-Frage sed-Bearbeitungsdatei in Position
Es wäre eine gute Option, wenn:
cat
nicht verwendet werden.Die Installation von Vim ist nicht zulässig oder dauert zu lange ... Meine Situation verwendet das MySQL 5.7-Image, wenn ich die my.cnf
-Datei ändern möchte, es keine vim
, vi
gibt und die Vim-Installation zu lange dauert (China Great Firewall). sed
ist im Bild enthalten und es ist ziemlich einfach. Meine Verwendung ist wie
sed -i /s/testtobechanged/textwanted/g filename
Verwenden Sie man sed
oder suchen Sie nach anderen Tutorials für eine komplexere Verwendung.
Es ist ein bisschen verrückt, aber Sie können sed
oder awk
verwenden, um kleine Änderungen vorzunehmen oder Text zu entfernen. Seien Sie mit Ihren Regex-Zielen natürlich vorsichtig und beachten Sie, dass Sie wahrscheinlich root
in Ihrem Container sind und möglicherweise Berechtigungen anpassen müssen.
So 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
Ein einfacher Weg, um ein paar Zeilen zu bearbeiten, wäre:
echo "deb http://deb.debian.org/debian stretch main" > sources.list
Sie können auch einen speziellen Container verwenden, der nur den Befehl enthält, den Sie benötigen: Vim. Ich wählte Python-Vim . 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 nur einen speziellen Container für diese Arbeit.
Wenn Sie einen Windows-Container verwenden und eine beliebige Datei ändern möchten, können Sie Vim in der Powershell-Konsole problemlos abrufen und verwenden.
So stellen Sie mit PowerShell eine Shell für den Windows Docker-Container bereit:
docker exec -it <name> powershell
Installieren Sie zuerst Chocolatey Package Manager
Invoke-WebRequest https://chocolatey.org/install.ps1 -UseBasicParsing | Invoke-Expression;
Installieren Sie Vim
choco install vim
Refresh ENVIRONMENTAL VARIABLE Sie können nur exit
und Shell zurück in den Container
Gehe zum Speicherort und Vim it vim file.txt