it-swarm.com.de

Wie bearbeite ich eine Datei, nachdem ich in einen Docker-Container Shell gelegt habe?

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?

364
Igor Barinov

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.

534
Opal

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.

307
hkong

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

59
meijsermans

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
43
Matthew

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
10
yan

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.

6
ynux

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
5
David Dehghan

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

apt-get update
apt-get install nano
2
Dos

Für allgemeine Bearbeitungsoperationen ziehe ich es vor, vi ( vim-tiny ) zu installieren, das nur 1491 kB oder nano mit 1707 kB.

Andererseits verwendet vim28,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.

2
simhumileco

Siehe Stack Overflow-Frage sed-Bearbeitungsdatei in Position

Es wäre eine gute Option, wenn:

  1. Um eine große Datei zu ändern, kann cat nicht verwendet werden.
  2. 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.

1
Shihe Zhang

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

(Mehr)

1
bbeecher

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.

0
MaxiReglisse

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

0
Aidar Gatin