Կոնտեյների բոլոր գործընթացները կաշխատեն որպես արմատային օգտվող, եթե այն հատուկ ձևով չնշեք: Սա շատ հարմար է թվում, քանի որ այս օգտվողը սահմանափակումներ չունի։ Սա է պատճառը, որ որպես root աշխատելը սխալ է անվտանգության տեսանկյունից: Եթե ոչ ոք խելամիտ չի աշխատում տեղական համակարգչում արմատային իրավունքներով, ապա շատերը պրոցեսներ են վարում root-ի տակ կոնտեյներներում:
Միշտ կան վրիպակներ, որոնք թույլ կտան չարամիտ ծրագրերին փախչել կոնտեյներից և մտնել հյուրընկալող համակարգիչ: Ենթադրելով ամենավատը, մենք պետք է ապահովենք, որ կոնտեյների ներսում պրոցեսներն իրականացվեն օգտագործողի կողմից, ով չունի որևէ իրավունք հյուրընկալող մեքենայի վրա:
Օգտագործողի ստեղծում
Կոնտեյներով օգտատեր ստեղծելը ոչնչով չի տարբերվում Linux բաշխումներում այն ստեղծելուց: Այնուամենայնիվ, հրամանները կարող են տարբեր լինել տարբեր բազային պատկերների համար:
Debian-ի վրա հիմնված բաշխումների համար դուք պետք է ավելացնեք հետևյալը Dockerfile-ում.
RUN groupadd --gid 2000 node
&& useradd --uid 2000 --gid node --shell /bin/bash --create-home node
Ալպյան համար.
RUN addgroup -g 2000 node
&& adduser -u 2000 -G node -s /bin/sh -D node
Գործընթացներ օգտագործողի կողմից
Բոլոր հետագա գործընթացները որպես UID 2000 օգտագործող գործարկելու համար գործարկեք՝
USER 2000
Բոլոր հետագա գործընթացները որպես հանգույց օգտագործող գործարկելու համար գործարկեք՝
USER node
Ավելին ՝
Մոնտաժման ծավալներ
Կոնտեյների ներսում ծավալներ տեղադրելու ժամանակ օգտագործողին տրամադրեք ֆայլեր կարդալու և/կամ գրելու հնարավորություն: Դա անելու համար բեռնարկղում գտնվող օգտատիրոջ UID-ը (GID) և բեռնարկղից դուրս գտնվող օգտատերը, ով ունի ֆայլ մուտք գործելու համապատասխան թույլտվություններ, պետք է համընկնի: Այս դեպքում օգտվողի անունները նշանակություն չունեն:
Հաճախ Linux համակարգչի վրա օգտագործողի UID-ն և GID-ը հավասար են 1000-ի: Այս նույնացուցիչները վերագրվում են համակարգչի առաջին օգտագործողին:
Ձեր նույնացուցիչները պարզելը հեշտ է.
id
Դուք կստանաք համապարփակ տեղեկատվություն ձեր օգտատիրոջ մասին:
Փոխարինեք օրինակներից 2000-ը ձեր նույնացուցիչով և ամեն ինչ լավ կլինի:
Օգտագործողին UID և GID-ի նշանակում
Եթե օգտվողը նախկինում ստեղծվել է, բայց դուք պետք է փոխեք նույնացուցիչները, կարող եք դա անել այսպես.
RUN usermod -u 1000 node
&& groupmod -g 1000 node
Եթե դուք օգտագործում եք ալպիական հիմքի պատկերը, ապա պետք է տեղադրեք ստվերային փաթեթը.
RUN apk add —no-cache shadow
Պատկերը կառուցելիս օգտագործողի ID-ի փոխանցումը կոնտեյների ներսում
Եթե ձեր ID-ն և նախագծի վրա աշխատող բոլոր մարդկանց ID-ները համընկնում են, ապա պարզապես նշեք այս ID-ն Dockerfile-ում: Այնուամենայնիվ, հաճախ օգտվողի ID-ները չեն համընկնում:
Ինչպես հասնել ձեր ուզածին, անմիջապես պարզ չէ: Ինձ համար դա ամենադժվարն էր Docker-ին տիրապետելու գործընթացում։ Դոկերի օգտատերերից շատերը չեն գիտակցում, որ պատկերի կյանքում կան տարբեր փուլեր: Նախ, պատկերը հավաքվում է Dockerfile-ի միջոցով: Պատկերից կոնտեյներ գործարկելիս Dockerfile-ն այլևս չի օգտագործվում:
Օգտատիրոջ ստեղծումը պետք է տեղի ունենա, երբ պատկերը ստեղծվի: Նույնը վերաբերում է օգտատիրոջը որոշելուն, ում կողմից գործարկվում են գործընթացները: Սա նշանակում է, որ մենք պետք է ինչ-որ կերպ փոխանցենք UID-ը (GID) կոնտեյների ներսում:
Դիրեկտիվները օգտագործվում են Dockerfile-ում արտաքին փոփոխականներ օգտագործելու համար
dockerfile
ARG UID=1000
ARG GID=1000
ENV UID=${UID}
ENV GID=${GID}
RUN usermod -u $UID node
&& groupmod -g $GID node
Դուք կարող եք փաստարկներ փոխանցել docker-compose-ի միջոցով այսպես.
դոկտոր-կոմպոզիցիա
build:
context: ./src/backend
args:
UID: 1000
GID: 1000
Հ.Գ. Docker-ի բոլոր բարդությունները տիրապետելու համար բավական չէ կարդալ փաստաթղթերը կամ հոդվածները: Դուք պետք է շատ պարապեք, դուք պետք է զգաք Docker-ը:
Source: www.habr.com