Zamontuj zawartość kontenera Docker w systemie plików hosta

24

Chcę mieć możliwość sprawdzenia zawartości kontenera Docker (tylko do odczytu). Eleganckim sposobem na zrobienie tego byłoby zamontowanie zawartości kontenera w katalogu. Mówię o zamontowaniu zawartości kontenera na hoście, a nie o zamontowaniu folderu na hoście w kontenerze.

Widzę, że w Dockerze są teraz dwa sterowniki pamięci: aufs i btrfs. Moja własna instalacja Docker używa btrfs, a przeglądanie do / var / lib / docker / btrfs / subvolumes pokazuje mi jeden katalog na kontener Docker w systemie. Jest to jednak szczegół implementacji Dockera i zamontowanie go w innym katalogu jest błędem.

Czy istnieje odpowiedni sposób, aby to zrobić, czy też muszę załatać Dockera, aby obsługiwał tego rodzaju mocowania?

dflemstr
źródło
Dlaczego byłoby błędem wiązać je gdzieś indziej?
Michael Hampton
1
Ponieważ miejsce przechowywania jest szczegółem implementacji. W dzień doker dodaje kolejny sterownik magazynu, lokalizacja zostanie przeniesiona. Muszę zrobić to półautomatycznie i z tego powodu fajnie byłoby korzystać z publicznych interfejsów API.
dflemstr
2
Warto rozważyć pracę nad nsenter (lub docker-enter), aby osiągnąć swoje cele; oczywiście istnieje konieczność przeszukania kodu / narzędzi inspekcyjnych wewnątrz kontenera.
VladFr
Czy nie ma sposobu, aby poinstruować Linuksa, aby montował przez granicę kontenera?
dflemstr
@dflemstr tak, istnieje, --volumes-from kinda robi to, wydaje się, że montuje unię katalogu z obrazu podstawowego drugiego woluminu i woluminu, ale takie zachowanie nie jest udokumentowane
afaik

Odpowiedzi:

10

Spójrz na docker export.

Aby szybko wyświetlić listę plików w kontenerze:

docker export CONTAINER|tar -t

Eksportować:

docker export CONTAINER>snapshot.tar
docker export CONTAINER|tar x PATH-IN-CONTAINER

Lub obejrzeć plik:

docker export CONTAINER|tar x --to-stdout PATH-IN-CONTAINER
# e.g. 
docker export consul|tar x --to-stdout etc/profile

Docker 1.8 obsługuje cp :

https://docs.docker.com/reference/commandline/cp/

Usage:  docker cp [options] CONTAINER:PATH LOCALPATH|-
        docker cp [options] LOCALPATH|- CONTAINER:PATH

aktualizacja: po uruchomieniu należy ssh na maszynę dokującą.

laktak
źródło
2
Moje obrazy są dość duże (wieleset MiB), więc zrobienie tego, aby pobrać pojedyncze pliki, jest zbyt duże. Za każdym razem utworzy plik o pojemności kilkuset megabajtów.
dflemstr
@dflemstr użyj linii z tar x PATH-IN-CONTAINER, wyodrębni tylko te pliki, których potrzebujesz.
laktak
... ale całe tararchiwum jest nadal tworzone w demonie Docker, a utworzenie zajmuje wiele minut ...
dflemstr
@dflemstr nie jestem pewien, jaka jest twoja konfiguracja, ale np. docker export ubuntu|tar -t|grep etc/networkzajmuje mi to 3 sekundy.
laktak
Prawdopodobnie używasz tego na tym samym komputerze co demon Docker, więc nie musisz wykonywać transferu sieciowego, a ubuntuobraz jest naprawdę mały ...
dflemstr
3

Za pomocą zatwierdzenia dokera można zachować bieżący stan kontenera na nowym obrazie i uruchomić interaktywny kontener z tego obrazu, aby sprawdzić zawartość.

Z dokumentacji:

Przydatne może być zatwierdzenie zmian lub ustawień pliku kontenera w nowym obrazie. Umożliwia to debugowanie kontenera przez uruchomienie interaktywnej powłoki lub wyeksportowanie działającego zestawu danych na inny serwer.

Mam nadzieję że to pomoże.

Eric Citaire
źródło
2

Możesz użyć nsenter do uruchomienia programu inspekcyjnego (który prawdopodobnie musi być już zawarty w kontenerze) wewnątrz kontenera / przestrzeni nazw. Ale aby zamontować system plików kontenera, jak widać w nim, musisz zamontować oryginalny obraz i wszystkie warstwy, jeśli jest aufs, lub równoważne działanie dla mapera urządzeń, btrfs i innych (przyszłych) silników pamięci, różniących się w każdym przypadku. Prawdopodobnie bardziej efektywne byłoby pozwolenie dokerowi wykonać pracę za ciebie, dokładnie tak, jak powinno, i użyć nsenter do przeprowadzenia kontroli wewnątrz kontenera.

Istnieją inne podejścia. okno dokowane diff pokaże, jakie pliki zmieniły się w tym kontenerze, jeśli chcesz zobaczyć, co zmieniło się zamiast tego, co było w oryginalnym obrazie.

W przypadku danych, które muszą być trwałe i możliwe do sprawdzenia, prawdopodobnie lepszym rozwiązaniem byłoby umieszczenie ich w woluminie w kontenerze i zamontowanie go w prawdziwym systemie plików, w czystym kontenerze danych lub w tym samym kontenerze, ale że możesz uruchomić inny kontener za pomocą programu inspekcyjnego instalującego z niego te woluminy.

gmuslera
źródło
1

EDYCJA: Wypróbowałem poniższe rozwiązanie i niestety nie działało to dla mnie dobrze w praktyce. Zainstalowany system plików nie odzwierciedlał dokładnie systemu plików kontenera (nawet z cache=no). Nie jestem pewien, czy jest to podstawowy problem, czy też robię coś złego.

Możesz zainstalować sshd na obrazie dokera i użyć go docker execdo uruchomienia usługi ssh ( /usr/sbin/sshd -D) na kontenerze dokera (zwróć uwagę, że port SSH 22 kontenera dokowania musi być odsłonięty).

Następnie użyj przycisku, docker cpaby skopiować swój publiczny klucz ssh do /root/.ssh/authorized_keyskatalogu kontenera dokowanego.

Na koniec użyj, docker inspectaby znaleźć adres IP kontenera i zamontować system plików kontenera za pomocą

sudo sshfs -o allow_other,default_permissions,IdentityFile=/path/to/identityfile  [email protected]:/ /mnt/my_container

Trzeba by napisać skrypt, aby ten działał wygodnie w praktyce.

mnieber
źródło