Próbuję zbudować nowy obraz Dockera dla naszego procesu programowania, używając cpanm
do zainstalowania kilku modułów Perla jako obrazu podstawowego dla różnych projektów.
Podczas opracowywania pliku Docker cpanm
zwraca kod błędu, ponieważ niektóre moduły nie zostały poprawnie zainstalowane.
Jestem całkiem pewien, że muszę apt
zainstalować więcej rzeczy.
Moje pytanie brzmi: gdzie mogę znaleźć /.cpanm/work
katalog cytowany w danych wyjściowych, aby sprawdzić dzienniki? W ogólnym przypadku, jak mogę sprawdzić system plików nieudanego docker build
polecenia?
Poranna edycja Po odgryzieniu kuli i uruchomieniu find
odkryłem
/var/lib/docker/aufs/diff/3afa404e[...]/.cpanm
Czy to jest niezawodne, czy może lepiej jest budować „goły” pojemnik i uruchamiać rzeczy ręcznie, dopóki nie będę mieć wszystkich potrzebnych rzeczy?
/var/lib/docker/aufs/diff/3afa404e[...]/.cpanm
tych są wnętrzności Dockera i nie chciałbym z nimi zadzieraćOdpowiedzi:
Za każdym razem, gdy doker wykonuje
RUN
polecenie z pliku Docker, zatwierdzana jest nowa warstwa w systemie plików obrazu . Dogodnie możesz użyć tych identyfikatorów warstw jako obrazów, aby rozpocząć nowy kontener.Weź następujący plik Dockerfile:
i zbuduj to:
Teraz można rozpocząć nowy pojemnik z
00f017a8c2a6
,044e1532c690
i5bd8172529c1
:oczywiście możesz chcieć uruchomić powłokę w celu eksploracji systemu plików i wypróbowania poleceń:
Gdy jedno z poleceń Dockerfile nie powiedzie się, musisz poszukać identyfikatora poprzedniej warstwy i uruchomić powłokę w kontenerze utworzonym z tego identyfikatora:
Raz w pojemniku:
Jeśli naprawdę musisz eksperymentować na rzeczywistej warstwie, która nie powiodła się, zamiast pracować z ostatnią warstwą roboczą, zobacz odpowiedź Drew .
źródło
docker run --rm -it <id_last_working_layer> bash -il
a raz w kontenerze wypróbuj polecenie, które nie odtworzyło problemu, a następnie napraw polecenie i przetestuj je, w końcu zaktualizuj plik Docker za pomocą stałego polecenia.docker diff <container>
uzyskać dokładną listę zmian w systemie plików dokonanych na tej konkretnej warstwie (pliki dodane, usunięte lub zmienione w całym systemie plików dla tego obrazu).Unable to find image 'd5219f1ffda9:latest' locally
. Byłem jednak zdezorientowany wieloma rodzajami identyfikatorów. Okazuje się, że musisz użyć identyfikatorów umieszczonych bezpośrednio za strzałkami, a nie tych, które mówią „Wbiegam ...”.Najlepsza odpowiedź działa w przypadku, gdy chcesz sprawdzić stan bezpośrednio przed nieudanym poleceniem.
Pytanie dotyczy jednak sposobu sprawdzenia stanu samego uszkodzonego kontenera. W mojej sytuacji nieudane polecenie to kompilacja, która zajmuje kilka godzin, więc przewinięcie przed nieudanym poleceniem i ponowne uruchomienie zajmuje dużo czasu i nie jest bardzo pomocne.
Rozwiązaniem jest znalezienie kontenera, który zawiódł:
Zatwierdź to do obrazu:
A następnie uruchom obraz [w razie potrzeby, uruchamiając bash]:
Teraz patrzysz na stan kompilacji w momencie jej niepowodzenia, a nie w momencie przed uruchomieniem polecenia, które spowodowało awarię.
źródło
DOCKER_BUILDKIT=1
do budowyDockerfile
Docker buforuje cały stan systemu plików po każdej udanej
RUN
linii.Wiedząc to:
RUN
polecenia, skomentować go w Dockerfile (jak również wszelkich i wszystkich kolejnychRUN
poleceń), a następnie uruchomićdocker build
idocker run
znowu.RUN
poleceniu, po prostu dodaj|| true
do niego, aby zmusić go do sukcesu; następnie postępuj jak wyżej (pozostaw wszystkie i wszystkie kolejneRUN
polecenia komentowane, uruchomdocker build
idocker run
)Tada, nie musisz zadzierać z wewnętrznymi elementami Docker lub identyfikatorami warstw, a jako dodatkowy Docker automatycznie minimalizuje ilość pracy, którą należy ponownie wykonać.
źródło
Debugowanie błędów kroku kompilacji jest w rzeczywistości bardzo denerwujące.
Najlepszym rozwiązaniem, jakie znalazłem, jest upewnienie się, że każdy krok, który wykonuje prawdziwą pracę, zakończy się sukcesem, i dodanie sprawdzenia po tych, które się nie powiodły. W ten sposób otrzymujesz zatwierdzoną warstwę, która zawiera wyniki nieudanego kroku, które możesz sprawdzić.
Plik Docker, z przykładem po
# Run DB2 silent installer
wierszu:źródło
Chciałbym skomentować poniższy plik Docker, włączając w to linię obrażającą. Następnie możesz uruchomić kontener i ręcznie uruchomić polecenia dokera i przeglądać dzienniki w zwykły sposób. Np. Jeśli plik Docker to
i umiera w barze, zrobiłbym to
Następnie
źródło