Próbując naprawić błędy i debugować problemy z moją aplikacją, która jest podzielona na kilka kontenerów, często edytuję pliki w kontenerach:
albo jestem totalnie leniwy i instaluję nano i edytuję bezpośrednio w kontenerze lub
Dockeruję plik z kontenera, edytuję go, kopiuję z powrotem i restartuję kontener
Są to kroki pośrednie przed przejściem do nowej zawartości do budowania kontenera, co zajmuje dużo więcej czasu niż wykonanie powyższej czynności (co oczywiście jest tylko pośrednie / majsterkowanie).
Teraz często przerywam program startowy kontenera, który w przypadkach zepsutych jest skryptem węzła lub skryptem serwera WWW w języku Python, oba zazwyczaj zawodzą z powodu błędów składniowych.
Czy jest jakiś sposób na uratowanie tych kontenerów? Ponieważ nie uruchamiają się, nie mogę ich dokować, więc są dla mnie stracone. Następnie przechodzę do trasy rm / rmi / build / run po naprawieniu naruszającego pliku w danych wejściowych kompilacji.
Jak mogę edytować pliki w zatrzymanym kontenerze lub cp je w lub uruchomić powłokę w zatrzymanym kontenerze - cokolwiek, co pozwala mi naprawić ten kontener?
(Wygląda to trochę jak praca na zdalnym komputerze i zerwanie konfiguracji sieciowej - w ten sposób połączenie jest tracone „na zawsze” i trzeba użyć rozwiązania awaryjnego, jeśli istnieje).
Jak edytować pliki kontenerów Docker z hosta? wygląda na trafne, ale jest nieaktualne.
docker cp
do plików do kontenera (lub zbudować nowy obraz)docker commit
polecenia, aby złamać nowy obraz.name=$(docker commit); docker run -it $name /bin/sh
zrobisz, co chcesz.Odpowiedzi:
Miałem problem z kontenerem, który nie uruchamiał się z powodu złej zmiany konfiguracji, którą wprowadziłem. Udało mi się skopiować plik z zatrzymanego kontenera i edytować go. coś jak:
(popraw plik)
źródło
UpperDir
którego otrzymujeszdocker container inspect
- musisz poeksperymentować, aby zobaczyć, jak system nakładek reprezentuje pliki w podstawowej strukturze, które zostały usunięte w górnej warstwie.Odpowiadając na moje własne pytanie… wciąż mam nadzieję na lepszą odpowiedź od bardziej kompetentnej osoby !!
Istnieją 2 możliwości.
1) Edycja systemu plików bezpośrednio na hoście . Jest to nieco niebezpieczne i może spowodować całkowite zerwanie pojemnika, prawdopodobnie inne dane w zależności od tego, co pójdzie nie tak.
2) Zmiana skryptu startowego na coś, co nigdy nie zawodzi, jak uruchomienie basha, wykonanie poprawek / edycji, a następnie zmiana programu startowego ponownie na pożądany (jak node lub cokolwiek to było wcześniej).
Więcej szczegółów:
1) Korzystanie
aby znaleźć uruchomione kontenery lub
aby znaleźć wszystkie pojemniki (w tym zatrzymane) i
poszukaj „Id”, jednej z pierwszych wartości.
To jest część, która zawiera szczegóły implementacji i może ulec zmianie, pamiętaj, że w ten sposób możesz stracić kontener.
Iść do
i tam znajdziesz wszystkie pliki, które zostały zmienione w kierunku obrazu, na którym oparty jest kontener. Możesz nadpisywać pliki, dodawać lub edytować pliki.
Ponownie, nie polecam tego.
2) Jak opisano na https://stackoverflow.com/a/32353134/586754 , konfigurację json config.json można znaleźć w ścieżce takiej jak
Tam możesz zmienić argumenty z np. „Nodejs app.js” na „/ bin / bash”. Teraz zrestartuj usługę dockera i uruchom kontener (powinieneś zobaczyć, że teraz poprawnie się uruchamia). Powinieneś użyć
aby upewnić się, że nie zakończy się od razu. Możesz teraz pracować z kontenerem i / lub później dołączyć z
docker exec -ti (containername) /bin/bash
Ponadto docker cp jest raczej przydatny do kopiowania plików, które były edytowane poza kontenerem.
Ponadto do tych środków należy wracać tylko wtedy, gdy pojemnik i tak jest mniej więcej „zgubiony”, więc każda zmiana byłaby poprawą.
źródło
config.json
plików za każdym razem, gdy je edytowałemMożesz bezpośrednio edytować system plików kontenera, ale nie wiem, czy to dobry pomysł. Najpierw musisz znaleźć ścieżkę do katalogu, który jest używany jako katalog główny w środowisku wykonawczym dla kontenera. Biegnij
docker container inspect id/name
. Poszukaj kluczaUpperDir
w danych wyjściowych JSON.To jest twój katalog.
źródło
Jeśli próbujesz ponownie uruchomić zatrzymany kontener i chcesz go zmienić z powodu błędnej konfiguracji, ale kontener się nie uruchamia, możesz wykonać następujące czynności, które działają przy użyciu polecenia „docker cp” (podobnie jak w poprzedniej sugestii). Ta procedura umożliwia usuwanie plików i wprowadzanie wszelkich innych potrzebnych zmian. Przy odrobinie szczęścia możesz pominąć wiele poniższych kroków.
Na przykład zmodyfikuj lub utwórz nowy skrypt punktu wejścia
#!/bin/bash tail -f /etc/hosts
źródło