Jak edytować plik po powłoce w kontenerze Docker?


517

Z powodzeniem ostrzelałem do kontenera Docker, używając:

docker exec -i -t 69f1711a205e bash

Teraz muszę edytować plik i nie mam w nim żadnych edytorów:

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

Jak edytować pliki?


@Opal Używam confluent / postgres-bw: 0.1
Igor Barinov

2
@Opal apt-get install vim działa. dzięki!
Igor Barinov,

3
dlaczego więc nie utworzyć Dockerfilei dołączyć komendy apt-get install i wygenerować własny kontener? Kontener Docker jest zaprojektowany tak, a nie na twój sposób.
BMW

1
doker powinien zainstalować co najmniej w edytorze testów, przynajmniej domyślnie vim
Bawantha

Odpowiedzi:


722

Jak w komentarzach, nie ma domyślnego zestawu edytorów - dziwne - $EDITORzmienna środowiskowa jest pusta. Możesz zalogować się do kontenera za pomocą:

docker exec -it <container> bash

I biegnij:

apt-get update
apt-get install vim

Lub użyj następującego pliku Docker:

FROM  confluent/postgres-bw:0.1

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

Obrazy dokerów są dostarczane przycięte do absolutnego minimum - więc z dostarczonym kontenerem nie jest instalowany żaden edytor. Dlatego trzeba go zainstalować ręcznie.

EDYTOWAĆ

Zachęcam również do przeczytania mojego postu na ten temat.


3
Potrzebne jest zamontowanie woluminu: docs.docker.com/userguide/dockervolumes
Opal

15
Musiałem zalogować się jako root, aby to zrobić docker exec -u 0 -it container_name bash.
Eng

34
Podobnie jak w przypadku dokera vim-tiny, prawdopodobnie lepiej go zainstalować .
ryenus

2
Być może warto rozważyć zainstalowanie edytora w każdym kontenerze, do którego się podłączasz, a raczej tylko raz na hoście dokera. Jak wspomnieli inni komentatorzy, możesz zamontować wolumin, aby móc edytować pliki, które będą montowane, lub przejść do samych danych kontenera i edytować pliki w/var/lib/docker/
Pitt

4
Chciałem tylko zmienić jedną konfigurację z prawdy na fałsz w kontenerze. apt-getnie działał z powodu problemu z uprawnieniami w kontenerze, więc próbowałem sed -i 's/texttobechanged/textwanted/g' filename. To zadziałało dla mnie.
Amreesh Tyagi,

420

Jeśli nie chcesz dodawać edytora, aby wprowadzić kilka drobnych zmian (np. Zmienić konfigurację Tomcat), możesz po prostu użyć:

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

który kopiuje go na komputer lokalny (do bieżącego katalogu). Następnie edytuj plik lokalnie za pomocą swojego ulubionego edytora, a następnie wykonaj

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

zastąpić stary plik.


21
@Igor To powinno być faktycznie przyjęte rozwiązanie, ponieważ jest to właściwy sposób, aby to zrobić bez dodawania dodatkowych pakietów do kontenera, podczas gdy dodawanie pakietów powinno być rozwiązaniem wtórnym.
Routhinator,

1
W przypadku platform Windows można użyć na przykład: docker cp <container>:C:\inetpub\wwwroot\Web.config .i docker cp Web.config <container>:C:\inetpub\wwwroot\Web.config.
Rosberg Linhares,

1
Ładne obejście do celów testowych! Nie polecam robić tego w produkcji.
Michal Šípek

9
A co polecasz do produkcji? Czy ludzie powinni edytować pliki w kontenerze interaktywnie podczas produkcji?
lucid_dreamer

4
Warto zauważyć, że ta metoda zmienia właściciela pliku. Jest to możliwe, ale nieco kłopotliwe, aby zmienić go później, przechodząc do kontenera jako root ( docker exec -u 0 -it mycontainer bash), a następnie uruchamiając chownpolecenie.
Steve Chambers,

91

Możesz użyć, catjeśli jest zainstalowany, co najprawdopodobniej tak będzie, jeśli nie jest to pusty / surowy pojemnik. Działa w mgnieniu oka i dobrze, gdy kopiuj + wklej lokalnie do odpowiedniego edytora.

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

catwypisze każdą linię po otrzymaniu nowej linii. Pamiętaj, aby dodać nowy wiersz dla tego ostatniego wiersza. ctrl-c wysyła SIGINTkota z wdziękiem. Z komentarzy widać, że można także nacisnąć ctrl-d, aby zaznaczyć koniec pliku („nie ma już żadnych danych wejściowych”).

Inną opcją jest coś, infilterco wstrzykuje proces do przestrzeni nazw kontenera z pewną magią ptrace: https://github.com/yadutaf/infilter


3
Jest to niezwykle przydatne, jeśli występują problemy z uprawnieniami do wkroplenia!
Rzym.

17
ctrl+Djest lepszy niż ctrl+C. ctrl+Dwysyła EOF. Nie musisz dodawać dodatkowej nowej linii na końcu. Dzięki ctrl+C, jeśli zapomnisz dodać nowy wiersz, stracisz ostatnią linię!
wisbucky

1
@wisbucky Nice! Nawet lepiej. Może jednak trzeba dwukrotnie nacisnąć kombinację klawiszy Ctrl-D.
meijsermans

52

Aby utrzymać małe obrazy Dockera, nie instaluj niepotrzebnych edytorów. Możesz edytować pliki przez SSH z hosta Dockera do kontenera:

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

2
Dziękuję Ci. Chciałem zostawić ten link, który lepiej wyjaśnia vim scp:// vim.wikia . Ponadto, aby uzyskać adres IP kontenera, możesz użyćsudo docker inspect <container_id> | grep "IPAddress"
aJetHorn

1
Zastanawiam się, czy dosłownie używam „zdalnego użytkownika” czy „dokera”? Próbowałem: vim scp://docker@172.17.0.17//data/gitea/conf/app.inizarówno jak vim scp://remoteuser@172.17.0.17//data/gitea/conf/app.inii oba tworzą po prostu nowy, pusty plik.
J. Scott Elblein,

1
@ J.ScottElblein Wymaga to najpierw skonfigurowania sshkontenera dokera . Zobacz blog.softwaremill.com/… . Ale generalnie nie chcesz instalować sshw swoim kontenerze.
wisbucky 17.07.19

14

Czasami musisz najpierw uruchomić kontener z root:

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

Następnie w kontenerze, aby zainstalować Vima lub coś innego:

apt-get install vim

7

Używam „docker run” (nie „docker exec”) i jestem w strefie ograniczonej, w której nie możemy zainstalować edytora. Ale mam edytor na hoście Docker.

Moje obejście polega na: powiązaniu zamontowania woluminu z hosta Dockera do kontenera ( https://docs.docker.com/engine/reference/run/#/volume-shared-filesystems ) i edycji pliku poza kontenerem. To wygląda tak:

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

Jest to głównie do eksperymentów, a później zmieniam plik podczas tworzenia obrazu.


6

Po ostrzelaniu do kontenera Docker po prostu wpisz:

apt-get update
apt-get install nano

6

Możesz otworzyć istniejący plik za pomocą

cat filename.extension

i skopiuj cały istniejący tekst do schowka.

Następnie usuń stary plik za pomocą

rm filename.extension

lub zmień nazwę starego pliku za pomocą

mv old-filename.extension new-filename.extension

Utwórz nowy plik za pomocą

cat > new-file.extension

Następnie wklej cały tekst skopiowany do schowka, naciśnij Enteri wyjdź z zapisz, naciskając ctrl+z. I voila nie trzeba instalować żadnych edytorów.


5

Możesz po prostu edytować plik na hoście, szybko skopiować go i uruchomić w kontenerze. Oto mój jednowierszowy skrót do skopiowania i uruchomienia pliku Python:

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

1
Jak to odpowiada na pytanie? - „Jak edytować pliki?”
Peter Mortensen

4

Do typowych operacji edycyjnych wolę zainstalować vi( vim-tiny ), który używa tylko 1491 kB lub nanoktóry używa 1707 kB .

Z drugiej strony vimużywa 28,9 MB .

Musimy pamiętać, że apt-get installaby pracować, musimy zrobić to updateza pierwszym razem, więc:

apt-get update
apt-get install vim-tiny

Aby uruchomić edytor w CLI , musimy wejść vi.


2

Jeśli używasz kontenera Windows i chcesz zmienić dowolny plik, możesz łatwo uzyskać i używać Vima w konsoli Powershell.

Aby wykonać ostrzał do kontenera Windows Docker za pomocą PowerShell:

docker exec -it <name> powershell

  • Najpierw zainstaluj menedżera pakietów Chocolatey

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

  • Zainstaluj Vima

    choco install vim

  • Odśwież ZMIENNE ŚRODOWISKOWE Możesz po prostu exitpowrócić do pojemnika

  • Przejdź do lokalizacji pliku i Vim go vim file.txt


1

Jest to trochę nieprzyjemne, ale w mgnieniu oka możesz użyć sedlub awkwprowadzić małe zmiany lub usunąć tekst. Uważaj oczywiście na cele wyrażenia regularnego i pamiętaj, że prawdopodobnie jesteś rootna swoim kontenerze i być może będziesz musiał ponownie dostosować uprawnienia.

Na przykład usunięcie pełnego wiersza zawierającego tekst pasujący do wyrażenia regularnego:

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

(Więcej)



1

Zobacz plik edycji przepełnienia stosu na miejscu

Byłaby to dobra opcja, jeśli:

  1. Aby zmodyfikować duży plik, nie można go użyć cat.
  2. Instalowanie Vima jest niedozwolone lub trwa zbyt długo. Moja sytuacja jest przy użyciu MySQL 5.7 obraz, gdy chcę zmienić my.cnfplik, tam nie ma vim, vii Vim zainstalować trwa zbyt długo (Chiny Great Firewall). sedjest pokazany na obrazku i jest dość prosty. Moje użycie jest jak

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

    Użyj man sedlub poszukaj innych samouczków, aby uzyskać bardziej złożone zastosowanie.


1

Możesz użyć, catjeśli jest zainstalowany, z >caracter. Oto manipulacja:

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

Teraz możesz zobaczyć wynik za pomocą polecenia

cat file

0

Możesz także użyć specjalnego kontenera, który będzie zawierał tylko potrzebne polecenie: Vim. Wybrałem python-vim . Zakłada się, że dane, które chcesz edytować, znajdują się w kontenerze danych zbudowanym z następującego pliku Docker:

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

Będziesz mógł edytować swoje dane, instalując wolumin Docker (src_volume), który będzie współdzielony przez twój kontener danych (src_data) i kontener 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

W ten sposób nie zmieniasz swoich pojemników. Do tej pracy używasz specjalnego pojemnika.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.