Kontener VPN kończy się z 'exec format error': zła platforma
'exec format error' oznacza, że plik binarny zbudowano dla innego procesora, a nie że brakuje NET_ADMIN. Przeczytaj indeks obrazu, zanim zmienisz trasy lub dane logowania.
Kontenery, które natychmiast kończą się z exec format error, skłaniają do złego odruchu: dodania uprawnienia, zamontowania urządzenia, edycji konfiguracji tunelu. Nic z tego nie dociera do problemu. Jądro nie mogło w ogóle uruchomić pliku binarnego, co w kontenerze prawie zawsze oznacza, że obraz jest przeznaczony dla innej architektury procesora niż host. Wszystko, co mógłbyś zmienić w trasowaniu, danych logowania lub uprawnieniach, dzieje się po uruchomieniu programu, a żaden program się nie uruchomił.
Komunikat startowy, który wygląda jak błąd konfiguracji
Błąd formatu exec pochodzi od loadera, zanim aplikacja przeczyta choć jedno ustawienie. Dlatego nie tworzy żadnych ostrzeżeń konfiguracyjnych ani dziennika tunelu, ponieważ nie ma żywego procesu, który by je zapisał. Błąd jest też wyjątkowo szybki, często zanim w dzienniku kontenera pojawi się choć jedna linia. Ten sam krótki komunikat pojawia się niezależnie od tego, czy plik binarny jest dla innej architektury, dla innego systemu operacyjnego, czy uszkodzony.
Zapisz środowisko uruchomieniowe i architekturę wraz z dokładnym odwołaniem do obrazu, a następnie sprawdź, co to odwołanie faktycznie oferuje. W Docker Desktop platforma kontenera należy do maszyny wirtualnej Linux, a nie do laptopa, więc sama architektura hosta może wprowadzać w błąd. Przeczytaj listę wpisów indeksu dla tego odwołania, a nie tekst marketingowy na jego stronie znacznika.
Przeczytaj indeks obrazu przed poleceniem uruchomienia
Gdy rejestr publikuje odwołanie wieloplatformowe, znacznik wskazuje indeks, a każdy wpis nazywa platformę z własnym digestem. Zbadaj odwołanie będące przedmiotem przeglądu, a nie sąsiedni znacznik, i przeczytaj indeks, zamiast zakładać, co zawiera.
docker buildx imagetools inspect ghcr.io/example/vpn:1.4
docker image inspect --format '{{.Os}}/{{.Architecture}}' ghcr.io/example/vpn:1.4
Pierwsze polecenie wymienia platformy publikowane przez odwołanie. Drugie podaje platformę obrazu już obecnego lokalnie, i to właśnie ten obraz uruchomi środowisko. Odwołanie z tylko jednym wpisem oznacza, że każdy host otrzymuje ten sam plik binarny, a znacznik nie pomoże maszynie, dla której nigdy go nie zbudowano.
Znaczniki wybierają wariant; nie tworzą go
Indeks wieloplatformowy pozwala środowisku wybrać pasujący wpis, co jest naprawdę wygodne i często mylone z przenośnością. Wybór to wyszukiwanie, a nie tłumaczenie: jeśli wariantu nie ma, nie ma czego wybierać. Ten sam znacznik na dwóch hostach może więc dać dwa różne pliki binarne, a na jednym hoście nie daje niczego użytecznego.
Przypięcie przez digest usuwa niejednoznaczność i umożliwia późniejszy przegląd, ponieważ digest dokładnie identyfikuje przetestowane bajty. Zachowaj ten digest wraz z zapisem wdrożenia, zamiast polegać na znaczniku, który przypadkiem był aktualny.
Emulacja to uzgodnienie, a nie warstwa tłumaczenia
Emulacja przez obsługiwane środowisko uruchomieniowe może uruchamiać niektóre nienatywne obciążenia przestrzeni użytkownika, więc absolutne twierdzenie, że jedna architektura nigdy nie uruchomi obrazu innej, jest błędne. To także nie jest ogólne rozwiązanie. Emulowane wykonanie ma inne charakterystyki wydajności, a trywialny proces, który się uruchamia, nic nie mówi o tym, czy obciążenie tunelu zachowuje się akceptowalnie.
Przewodnik wieloplatformowy Dockera traktuje natywne budowanie, kompilację krzyżową i emulację jako odrębne strategie, i to jest właściwy sposób czytania opcji. Wybierz jedną świadomie i zweryfikuj obciążenie VPN w jej ramach, zamiast zakładać równoważność.
Uprawnienia rozwiązują inny problem
Przyznanie uprawnienia do administracji siecią lub przekazanie urządzenia TUN nie może uruchomić niekompatybilnego pliku wykonywalnego. To uprawnienia środowiska uruchomieniowego, których używa działający proces; są niewidoczne dla loadera, który już odrzucił plik.
Odwrotnie jest równie prawdziwie. Natywny plik binarny niczego nie dowodzi w kwestii uprawnień, dostępu do urządzeń, integracji resolvera ani polityki ponownego uruchamiania, której potrzebuje tunel, więc kontener, który się uruchamia, nie jest jeszcze kontenerem, który działa. Najpierw ustal kontrakt platformy, a potem przejdź do kontraktu uruchomieniowego z jego udokumentowanymi opcjami.
Przechowuj digest obrazu, obsługiwany cel i konfigurację razem w tym samym rekordzie. Aktualizację znacznika, która po cichu zmienia architekturę, łatwiej wychwycić, gdy poprzedni digest jest zapisany, niż gdy jedynym objawem jest znany błąd i nowe popołudnie spędzone na debugowaniu.