Docker build පෞද්ගලික යැපුමකට ළඟා නොවේ: මෙය පරීක්ෂා කරන්න
සත්කාරකයට ගත හැකි පෞද්ගලික පැකේජයක් build තුළදී අසාර්ථක විය හැක. builder නම් කරන්න, මාර්ගය ඔප්පු කරන්න, පසුව ටෝකනය build secret ලෙස mount කරන්න.
ඔබේ යන්ත්රයේ ගැටලුවකින් තොරව විසඳෙන පෞද්ගලික පැකේජයක් build තුළදී 404 හෝ කාල ඉකුත්වීමක් සමඟ අසාර්ථක විය හැක, Dockerfile ඊට හේතු වන්නේ කලාතුරකිනි. build පියවර වෙනත් ජාල නාම අවකාශයක ධාවනය වේ, වෙනත් DNS දර්ශනයක් සහ වෙනත් අක්තපත්ර ගබඩාවක් සමඟ, ඔබ පරීක්ෂා කළ shell එකට වඩා වෙනස්ව. මෙම පරීක්ෂණ පිළිවෙළින් කරන්න, පළමුව අසාර්ථක වූ තැන නවතින්න, මන්ද සෑම පසු පරීක්ෂණයක්ම පෙර එක සමත් වූ බව උපකල්පනය කරයි. සෑම පියවරක්ම කාරණය තීරණය කරන විධානය නම් කරයි.
Dockerfile නොව, builder නමින් ආරම්භ කරන්න
BuildKit දේශීය, කන්ටේනරයක හෝ වෙනත් යන්ත්රයක ධාවනය විය හැක, එක් එක් එකට තමන්ගේම පෙරනිමි ජාලයක් ඇත. ධාවනය කරන්න docker buildx ls සහ කිසිවක් වෙනස් කිරීමට පෙර තරු ලකුණ සහිත නෝඩය කියවන්න. එක් docker-container ධාවකයක් හෝ cloud builder එකක් ඔබ එහි විධානය ටයිප් කළ නිසා පමණක් ඔබේ ලැප්ටොප් එකේ පෞද්ගලික මාර්ගය බෙදා නොගනී. සක්රීය builder දුරස්ථ නම්, ඉතිරි සෑම පරීක්ෂණයක්ම ඔබේ වැඩස්ථානයේ නොව, එම සත්කාරකයේ ධාවනය කළ යුතුය.
builder තමන්ගේම resolver වින්යාසය සහ proxy විචල්යද රැගෙන යයි. දෙකම build වේලාවේ කියවන අතර build ආරම්භ කළ ටර්මිනලයෙන් උරුම නොවේ.
build පියවරක් තුළින් ජාල මාර්ගය ඔප්පු කරන්න
යැපුමේ සත්කාරකය විසඳා එයට සම්බන්ධතාවක් විවෘත කරන එක්වරක් භාවිත කරන අදියරක් ලියන්න. builder සඳහා ප්රශ්නයට පිළිතුරු දෙන එකම පරීක්ෂණය මෙයයි, ඔබේ shell එකට නොවේ.
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/
ඔබේ සැබෑ build භාවිත කරන එම builder, ජාල මාදිලිය සහ secret mount සමඟ එම ගොනුව build කරන්න: docker buildx build --builder remote0 -f Dockerfile.probe --progress=plain .. කිසිවක් getent මුද්රණය නොකරන්නේ නම්, දෝෂය නාම විසඳුමේ ඇති අතර කිසිදු අක්තපත්රයක් එය නොසකසයි. නාමය විසඳෙන නමුත් curl කාල ඉකුත්වීමක් වාර්තා කරන්නේ නම්, බාධාව මාර්ගය හෝ ලේඛනාගාරය ඉදිරිපිට පිටවීමේ ප්රතිපත්තියයි.
පිළිතුරු දුන් වහාම අණ්වේෂකය මකන්න. මෙය රෝග විනිශ්චය අදියරක් වන අතර එය කිසිදා ටැග් හෝ push නොකළ යුතුය.
අක්තපත්රය පිටපත් කරනවාට වඩා mount කරන්න
මාර්ගය ක්රියාත්මක වූ පසු, ඊළඟ අසාර්ථකත්වය සත්යාපනයයි. BuildKit secret mount එකක් ගොනුවක් එක් RUN පියවරකට නිරාවරණය කරයි, එය ස්තරයකට නොලියා; යැපුම් මෙවලමට අවශ්ය වන්නේ එයයි, image එක රඳවා නොගත යුත්තේ ද එයයි.
RUN --mount=type=secret,id=npmrc,target=/root/.npmrc npm ci --omit=dev
secret එක Dockerfile එකෙන් පිටතින් සැපයිය යුතුය: docker buildx build --secret id=npmrc,src=/home/me/.npmrc .. ගොනුව සේවාදායකයා ළඟම රැඳෙන අතර කිසිදා image ඉතිහාසයට ඇතුළු නොවේ. එක් ARG හෝ ENV එකම ටෝකනය සමඟ මෙම කාර්යය නොකරයි, මන්ද දෙකම image වින්යාසයේ සටහන් වේ.
root නොවන image එකකට තමන්ගේම ඉලක්ක මාර්ගයක් අවශ්යයි, උදාහරණයක් ලෙස /home/app/.npmrc හෝ pip, Maven හෝ Cargo සඳහා සමාන ගොනුව. mount ඉලක්කය විධානය ධාවනය කරන පරිශීලකයාට ගැළපිය යුතුය, නැතිනම් මෙවලම ඇත්තටම ඇති වින්යාස ගොනුවක් නැති බව වාර්තා කරයි.
යැපුම් මෙවලම image එකේ ඉතිරි කරන දේ පරීක්ෂා කරන්න
තාවකාලික mount එකක් අක්තපත්රය ස්තරයෙන් පිටත තබයි, නමුත් මෙවලමට වෙනත් දෙයක් ලිවීම වළක්වන්නේ නැත. පැකේජ කළමනාකරුවන් lock ගොනු, cache නාමාවලි සහ සමහර විට විසඳන ලද ලේඛනාගාර URL ඉතිරි කරයි.
Dockerfile විශ්වාස කරනවාට වඩා නිමි ගොනු පද්ධතිය කියවන්න. docker history --no-trunc image:tag සෑම ස්තර විධානයක්ම ලැයිස්තුගත කරයි, සහ docker run --rm image:tag sh -c "ls -a /root" ධාවනය වන කන්ටේනරයට ඉතිරි වූ දේ පෙන්වයි. ගොනුව mount කළ පමණක් වුවද, ලොග් පේළියක ලියැවුණු ටෝකනය npm ci අතරතුරද තවමත් කාන්දුවකි.
build ලොගය ද කියවන්න, මන්ද --progress=plain විධානවල ප්රතිදානය වචනානුසාරයෙන් මුද්රණය කරයි. ටෝකනය එහි දිස්වන්නේ නම්, අන් සියල්ලට පෙර එය කරකවා, මෙවලම නිහඬව කියවන ගොනුවක් හරහා යවන්න.
ධාවන image එකට තවදුරටත් පෞද්ගලික මාර්ගය අවශ්ය නොවන බව තහවුරු කරන්න
build එක සහ ධාවනය වන යෙදුම එකම යැපුමේ වෙනස් පාරිභෝගිකයන් දෙදෙනෙකි, පෞද්ගලික මාර්ගය අවශ්ය වන්නේ පළමුවැන්නාට පමණි. නිමි image එකක් build කාලයේ අක්තපත්රය නොමැතිව ආරම්භ විය යුතුය, එහි ධාවන යැපුම් විසඳා ගත යුතුය සහ රථවාහන සේවය කළ යුතුය.
පෞද්ගලික ලේඛනාගාරයට ළඟා විය නොහැකි තැනක එය පරීක්ෂා කරන්න, නැතිනම් කන්ටේනරය නිකම්ම --network none සමඟ ආරම්භ කර mount කළ secret එකක් නොමැතිව එය ඇරඹෙන බව තහවුරු කරන්න. build secret එක ඇති විට පමණක් ආරම්භ වන කන්ටේනරයක් තවමත් build පරිසරයට බැඳී ඇත.
කන්ටේනරයට ධාවන වේලාවේ ලේඛනාගාරය සැබවින්ම අවශ්ය නම්, එය වෙනම ප්රවේශ තීරණයක් වන අතර එහි ස්ථානය සම්බන්ධීකාරකයේ secret ගබඩාවයි, build එකේ නොවේ. මාර්ග දෙක වෙන වෙනම ලේඛනගත කරන්න, කිසිවෙකු build ධජයකින් ධාවන පුල් එකක් සකසන්නට නොයෑමට. පරීක්ෂණ පහම සමත් වූ විට, මුල් රෝග ලක්ෂණයට සෑම ස්තරයකම නම් කළ හේතුවක් ඇත, Docker ජාලය ගැන අනුමානයක් නොවේ.