Build ya Docker haifiki kwenye tegemezi la faragha: angalia hii
Kifurushi cha faragha ambacho mwenyeji anaweza kukipata kinaweza kushindwa ndani ya build. Taja builder, thibitisha njia, kisha pandisha token kama build secret.
Kifurushi cha faragha kinachotatuliwa bila matatizo kwenye mashine yako kinaweza kushindwa ndani ya build kwa 404 au kwa mwisho wa muda, na Dockerfile mara chache huwa sababu. Hatua ya build hufanya kazi katika nafasi ya jina la mtandao tofauti, ikiwa na mwonekano tofauti wa DNS na hifadhi tofauti ya vitambulisho kuliko shell uliyojaribu. Pitia ukaguzi huu kwa mpangilio na usimame kwenye wa kwanza unaoshindwa, kwa sababu kila ukaguzi unaofuata hudhani kuwa ule uliopita ulifaulu. Kila hatua inataja amri inayoamua jambo hilo.
Anza kwa kutaja builder, si Dockerfile
BuildKit inaweza kuwa ya ndani, ndani ya kontena au kwenye mashine nyingine, na kila moja ina mtandao wake chaguo-msingi. Endesha docker buildx ls na soma nodi iliyowekwa alama ya nyota kabla ya kubadilisha chochote. Mojawapo docker-container ya vidhibiti au builder ya wingu haishiriki njia ya faragha kwenye kompyuta yako ya mkononi kwa sababu tu uliandika amri hapo. Ikiwa builder inayotumika iko mbali, kila ukaguzi uliobaki lazima uendeshwe dhidi ya mwenyeji huyo, si kituo chako cha kazi.
Builder pia hubeba mpangilio wake wa resolver na vigeu vya proxyvyake. Vyote viwili husomwa wakati wa build na hurithiwi kutoka kwenye terminal iliyoanzisha build.
Thibitisha njia ya mtandao kutoka ndani ya hatua ya build
Andika hatua ya mara moja inayotatua mwenyeji wa tegemezi na kufungua muunganisho kwake. Hii ni jaribio pekee linalojibu swali kwa builder, si kwa shell yako.
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/
Jenga faili hilo kwa builder huyo huyo, hali ya mtandao na mounts za secret ambazo build yako halisi hutumia: docker buildx build --builder remote0 -f Dockerfile.probe --progress=plain .. Ikiwa getent haichapishi kitu, hitilafu iko katika utatuzi wa majina na hakuna kitambulisho kitakachoirekebisha. Ikiwa jina linatatuliwa lakini curl inaripoti mwisho wa muda, kikwazo ni njia au sera ya kutoka mbele ya sajili.
Futa kifaa cha uchunguzi mara tu kinapojibu. Ni hatua ya utambuzi na haipaswi kamwe kuwekewa lebo au kusukumwa.
Pandisha kitambulisho badala ya kukinakili
Njia inapofanya kazi, uthibitishaji ni kushindwa kunakofuata kwenye foleni. Mount ya secret ya BuildKit huweka faili wazi kwa hatua RUN moja bila kuiandika kwenye tabaka, na hiyo ndiyo inayohitajika na chombo cha tegemezi na ambayo image haipaswi kuihifadhi.
RUN --mount=type=secret,id=npmrc,target=/root/.npmrc npm ci --omit=dev
Secret lazima itolewe kutoka nje ya Dockerfile: docker buildx build --secret id=npmrc,src=/home/me/.npmrc .. Faili hubaki kwa mteja na haiingii kamwe kwenye historia ya image. Kimoja ARG au ENV kilicho na token hiyo hiyo hakifanyi kazi hii, kwa sababu vyote viwili hurekodiwa kwenye mpangilio wa image.
Image isiyo na root inahitaji njia yake ya lengo, kwa mfano /home/app/.npmrc au faili sawa kwa pip, Maven au Cargo. Lengo la mount lazima lilandane na mtumiaji anayeendesha amri, vinginevyo chombo kitaripoti faili ya mpangilio inayokosekana ambayo kwa kweli ipo.
Kagua kile chombo cha tegemezi kinachoacha kwenye image
Mount ya muda huweka kitambulisho nje ya tabaka, lakini haizuii chombo kuandika kitu kingine. Wasimamizi wa vifurushi huacha faili za lock, saraka za cache na wakati mwingine anwani ya sajili iliyotatuliwa.
Soma mfumo wa faili uliokamilika badala ya kuamini Dockerfile. docker history --no-trunc image:tag huorodhesha kila amri ya tabaka, na docker run --rm image:tag sh -c "ls -a /root" huonyesha kilichobaki kwenye kontena inayoendesha. Hata faili ilipowekwa tu, token iliyoandikwa kwenye mstari wa kumbukumbu wakati npm ci bado ni uvujaji.
Soma pia kumbukumbu ya build, kwa sababu --progress=plain huchapisha matokeo ya amri neno kwa neno. Ikiwa token itaonekana hapo, izungushe kabla ya kitu kingine chochote na uipitishe kupitia faili ambayo chombo husoma kwa kimya.
Thibitisha kuwa image ya utekelezaji haihitaji tena njia ya faragha
Build na programu inayoendesha ni watumiaji wawili tofauti wa tegemezi moja, na ni wa kwanza pekee anayehitaji njia ya faragha. Image iliyokamilika inapaswa kuanza, kutatua tegemezi zake za utekelezaji na kuhudumia trafiki bila kitambulisho cha build.
Jaribu mahali ambapo sajili ya faragha haifikiki, au anza kontena kwa --network none na uthibitishe kuwa inaanza bila secret iliyopandishwa. Kontena linaloanza tu pale build secret ipo bado limefungamanishwa na mazingira ya build.
Ikiwa kontena kwa kweli linahitaji sajili wakati wa utekelezaji, huo ni uamuzi tofauti wa ufikiaji, na mahali pake ni hifadhi ya secret ya orkestrata, si build. Andika njia mbili kwa mpangilio ili mtu yeyote asijaribu kurekebisha pull ya utekelezaji kwa bendera ya build. Ukaguzi wote watano ukipita, dalili ya awali ina sababu iliyotajwa kwenye kila tabaka badala ya dhana kuhusu mtandao wa Docker.