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?


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ą.


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.


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.


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  root@xxx.xx.x.x:/ /mnt/my_container

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

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.