Privatni paket koji se na vašem računaru rešava bez problema može pasti unutar builda sa greškom 404 ili timeoutom, a Dockerfile je retko razlog. Korak builda radi u drugom mrežnom prostoru imena, sa drugačijim pogledom na DNS i drugim skladištem akreditiva od ljuske u kojoj ste testirali. Prođite ove provere redom i zaustavite se na prvoj koja padne, jer svaka kasnija pretpostavlja da je prethodna prošla. Svaki korak imenuje komandu koja rešava pitanje.

Počnite imenovanjem buildera, a ne Dockerfilea

BuildKit može biti lokalan, u kontejneru ili na drugom računaru, i svaki od njih ima svoju podrazumevanu mrežu. Pokrenite docker buildx ls i pročitajte čvor označen zvezdicom pre nego što bilo šta izmenite. Jedan docker-container drajver ili cloud builder ne deli privatnu rutu na vašem laptopu samo zato što ste komandu otkucali tamo. Ako je aktivni builder udaljen, svaka preostala provera mora se izvršiti na tom hostu, a ne na vašoj radnoj stanici.

Builder nosi i svoju konfiguraciju resolvera i proxy promenljive. Oboje se čita u vreme builda i ne nasleđuje se od terminala koji je build pokrenuo.

Dokažite mrežnu putanju iz unutrašnjosti koraka builda

Napišite privremenu fazu koja razrešava host zavisnosti i otvara vezu prema njemu. To je jedini test koji odgovara na pitanje za builder, a ne za vašu ljusku.

FROM alpine:3.20
RUN apk add --no-cache curl bind-tools  && getent hosts registry.example.internal  && curl -sS -o /dev/null -w "%{http_code}
" https://registry.example.internal/simple/

Izgradite tu datoteku istim builderom, mrežnim režimom i montažama tajni koje koristi vaš pravi build: docker buildx build --builder remote0 -f Dockerfile.probe --progress=plain .. Ako getent ništa ne ispiše, kvar je u razrešavanju imena i nikakav akreditiv ga neće popraviti. Ako se ime razreši ali curl prijavi timeout, prepreka je ruta ili izlazna politika ispred registra.

Obrišite sondu čim odgovori. To je dijagnostička faza i ne treba je nikada označavati ni potiskivati.

Montirajte akreditiv umesto da ga kopirate

Kad putanja proradi, autentifikacija je sledeći kvar u redu. BuildKit montaža tajne izlaže datoteku jednom RUN koraku bez upisivanja u sloj, što je ono što alat za zavisnosti treba i što slika ne sme da zadrži.

RUN --mount=type=secret,id=npmrc,target=/root/.npmrc     npm ci --omit=dev

Tajna mora da se dostavi izvan Dockerfilea: docker buildx build --secret id=npmrc,src=/home/me/.npmrc .. Datoteka ostaje na klijentu i nikada ne ulazi u istoriju slike. Jedan ARG ili ENV sa istim tokenom ne obavljaju taj posao, jer se oboje beleži u konfiguraciji slike.

Slika bez roota treba sopstvenu ciljnu putanju, na primer /home/app/.npmrc ili odgovarajuću datoteku za pip, Maven ili Cargo. Cilj montaže mora da odgovara korisniku koji izvršava komandu, inače će alat prijaviti nedostajuću konfiguracionu datoteku koja zapravo postoji.

Proverite šta alat za zavisnosti ostavlja u slici

Privremena montaža drži akreditiv izvan sloja, ali ne sprečava alat da upiše nešto drugo. Menadžeri paketa ostavljaju lock datoteke, keš direktorijume i ponekad razrešenu URL adresu registra.

Čitajte gotov datotečni sistem umesto da verujete Dockerfileu. docker history --no-trunc image:tag navodi svaku komandu sloja, a docker run --rm image:tag sh -c "ls -a /root" pokazuje šta je preživelo u pokrenutom kontejneru. Čak i kada je datoteka samo montirana, token upisan u liniju loga tokom npm ci izvršavanja i dalje je curenje.

Pročitajte i build log, jer --progress=plain ispisuje izlaz komandi doslovno. Ako se token tamo pojavi, rotirajte ga pre svega drugog i prosleđujte ga kroz datoteku koju alat čita tiho.

Proverite da runtime slici više nije potrebna privatna putanja

Build i aplikacija koja radi su dva različita potrošača iste zavisnosti, i samo prvom je potrebna privatna ruta. Gotova slika treba da se pokrene, razreši svoje runtime zavisnosti i služi saobraćaj bez akreditiva iz builda.

Testirajte to tamo gde je privatni registar nedostupan, ili jednostavno pokrenite kontejner sa --network none i potvrdite da se diže bez montirane tajne. Kontejner koji se pokreće samo kad je build tajna prisutna i dalje je vezan za build okruženje.

Ako kontejneru registar zaista treba u runtimeu, to je odvojena odluka o pristupu i pripada u secret store orkestratora, a ne u build. Dokumentujte dve putanje odvojeno da niko ne pokuša da popravi runtime pull build flagom. Kada svih pet provera prođe, izvorni simptom ima imenovan uzrok na svakom sloju umesto nagađanja o Docker mreži.

Povezani članci