VPN-container avsluttar med 'exec format error': feil plattform
'exec format error' tyder at binærfila er bygd for ein annan CPU, ikkje at NET_ADMIN manglar. Les imageindeksen før du endrar ruter eller påloggingsinformasjon.
Containerar som avsluttar med ein gong med exec format error, innbyr til den gale instinkten: leggje til ein kapabilitet, montere ei eining, endre tunnelkonfigurasjonen. Ingen av desse når problemet. Kjernen kunne ikkje køyre binærfila i det heile, noko som i ein container nesten alltid tyder at imaget er retta mot ein annan CPU-arkitektur enn verten sin. Alt du måtte endre på ruting, påloggingsinformasjon eller rettar skjer etter at eit program har starta, og ingen program starta.
Oppstartsmeldinga som ser ut som ein konfigurasjonsfeil
Ein exec-formatfeil kjem frå lastaren, før programmet les ei einaste innstilling. Derfor gir han ingen konfigurasjonsåtvaringar og ingen tunnellogg, fordi det ikkje finst nokon levande prosess som kan skrive dei. Feilen er òg særs rask, ofte før det i det heile viser seg ei linje i containerloggen. Den same korte meldinga viser seg anten binærfila er for ein annan arkitektur, for eit anna operativsystem eller skadd.
Noter køyretidsmiljøet og arkitekturen saman med den nøyaktige imagereferansen, og sjekk deretter kva den referansen faktisk tilbyr. På Docker Desktop høyrer containerplattforma til den virtuelle Linux-maskina og ikkje til laptoppen, så vertsarkitekturen åleine kan villede. Les indeksoppføringane for denne referansen i staden for marknadsføringsteksten på tag-sida.
Les imageindeksen før køyrekommandoen
Når eit register publiserer ein multi-plattform-referanse, peiker taggen på ein indeks, og kvar oppføring namngir ei plattform med sin eigen digest. Undersøk referansen som er under vurdering og ikkje ein nabotagg, og les indeksen i staden for å anta kva han inneheld.
docker buildx imagetools inspect ghcr.io/example/vpn:1.4
docker image inspect --format '{{.Os}}/{{.Architecture}}' ghcr.io/example/vpn:1.4
Den første kommandoen listar plattformene referansen publiserer. Den andre rapporterer plattforma til imaget som allereie finst lokalt, og det er dette køyretida vil køyre. Ein referanse med berre éi oppføring tyder at kvar vert får den same binærfila, og taggen kan ikkje hjelpe ei maskin han aldri vart bygd for.
Taggar vel ein variant; dei opprettar ikkje ein
Ein multi-plattform-indeks lèt køyretida velje ei passande oppføring, noko som er verkeleg praktisk og ofte forveksla med portabilitet. Valet er eit oppslag, ikkje ei omsetjing: viss varianten manglar, er det ingenting å velje. Den same taggen kan derfor på to vertar gi to ulike binærfiler, og på éin vert gir han ingenting brukbart.
Festing med digest fjernar tvitydigheita og gjer òg ein seinare gjennomgang mogeleg, fordi digesten identifiserer nøyaktig byta som vart testa. Ta vare på den digesten saman med utrullingsposten i staden for å stole på taggen som tilfeldigvis var aktuell.
Emulering er ei ordning, ikkje eit omsetjingslag
Emulering gjennom ei støtta køyretid kan køyre enkelte ikkje-native brukarromsarbeidslaster, så den absolutte påstanden om at éin arkitektur aldri kan køyre imaget til ein annan, er feil. Det er heller ikkje ei generell løysing. Emulert køyring har andre ytelseseigenskapar, og ein triviell prosess som startar fortel deg ingenting om korvidt ei tunnelarbeidslast oppfører seg akseptabelt.
Dockers rettleiiing for fleire plattformer behandlar native bygg, krysskompilering og emulering som separate strategiar, og det er den rette måten å lese alternativa på. Vel éin medvite, og kvalifiser VPN-arbeidslasta under han i staden for å anta ekvivalens.
Løyve løyser eit anna problem
Å gi ein nettverksadministrasjonskapabilitet eller å sleppe gjennom ei TUN-eining kan ikkje få ei inkompatibel køyrbar fil til å køyre. Dette er køyretidsløyve som ein køyrande prosess brukar; dei er usynlege for ein lastar som allereie har avvist fila.
Det motsette er like sant. Ei native binærfila beviser ingenting om privilegium, einingstilgang, resolver-integrasjon eller omstartspolicyen ein tunnel treng, så ein container som startar er enno ikkje ein container som verkar. Etabler plattformkontrakten først, og gå deretter vidare til køyretidskontrakten med dei dokumenterte alternativa hans.
Oppbevar image-digesten, den støtta målplattforma og konfigurasjonen saman i same post. Ei taggoppdatering som stille endrar arkitekturen, er lettare å fange når den førre digesten er skriven ned, enn når det einaste symptomet er ein kjend feil og ein ny ettermiddag med feilsøking.