, vÄr tekniska direktör, Àlskar, anvÀnder aktivt och frÀmjar Docker. I den nya artikeln berÀttar han hur man skapar anvÀndare i Docker. RÀtt hantering av dem, varför anvÀndare inte ska lÀmnas med root-rettigheter och hur man löser problemet med avvikande indikatorer i Dockerfile.
Alla processer i containern kommer att köras som anvÀndaren root, om det inte anges pÄ sÀrskilt sÀtt. Detta verkar vÀldigt bekvÀmt, eftersom denna anvÀndare inte har nÄgra begrÀnsningar. DÀrför Àr det fel att arbeta som root ur sÀkerhetssynpunkt. Om ingen pÄ den lokala datorn vid sina sinnens fulla bruk arbetar med root-rettigheter, sÄ kör mÄnga processer som root i containrar.
Det finns alltid buggar som gör att skadlig kod kan lÀmna containern och komma Ät vÀrddatorn. Givet det vÀrsta, bör vi sÀkerstÀlla att processer körs inuti containern av en anvÀndare som inte har nÄgra rÀttigheter pÄ vÀrddatorn.
Skapa anvÀndare
Att skapa en anvÀndare i containern skiljer sig inte frÄn att skapa en i Linux-distributioner. Men kommandona kan variera för olika grundbilder.
För distributioner baserade pÄ debian i Dockerfile mÄste man lÀgga till:
RUN groupadd --gid 2000 node
&& useradd --uid 2000 --gid node --shell /bin/bash --create-home nodeFör alpine:
RUN addgroup -g 2000 node
&& adduser -u 2000 -G node -s /bin/sh -D node
Kör processer som anvÀndare
För att köra alla efterföljande processer som anvÀndare med UID 2000, utför:
USER 2000För att köra alla efterföljande processer som anvÀndaren node, utför:
USER nodeMer information finns i .
Montering av volymer
NÀr du monterar volymer inuti containern, se till att anvÀndaren kan lÀsa och (eller) skriva filer. För detta mÄste UID (GID) för anvÀndaren i containern och anvÀndaren utanför containern, som har motsvarande tillgÄngsrÀttigheter till filen, matcha. AnvÀndarnamn spelar ingen roll.
Ofta har en anvÀndare pÄ en Linux-dator UID och GID motsvarande 1000. Dessa identifierare tilldelas den första anvÀndaren pÄ datorn.
Det Àr lÀtt att ta reda pÄ sina identifierare:
idDu kommer att fÄ utförlig information om din anvÀndare.
Byt ut 2000 i exemplen mot din egen identifierare sÄ blir allt bra.
Tilldela anvÀndaren UID och GID
Om anvÀndaren skapades tidigare men identifierarna behöver Àndras kan detta göras sÄ hÀr:
RUN usermod -u 1000 node
&& groupmod -g 1000 node
Om du anvÀnder en grundlÀggande alpine-image mÄste du installera paketet shadow:
RUN apk add --no-cache shadowĂverföring av anvĂ€ndaridentifierare in i containern vid byggandet av imagen
Om din identifierare och identifierarna för alla som arbetar med projektet överensstÀmmer, rÀcker det med att ange denna identifierare i Dockerfile. Men ofta överensstÀmmer inte anvÀndarnas identifierare.
Hur man Ästadkommer det önskade Àr inte alltid sjÀlvklart. För mig var detta det svÄraste i inlÀrningen av docker. MÄnga docker-anvÀndare tÀnker inte pÄ att det finns olika livscykelsteg för en image. Först byggs imagen, vilket görs med Dockerfile. NÀr container körs frÄn imagen anvÀnds Dockerfile inte lÀngre.
Skapandet av anvÀndare bör ske vid byggandet av imagen. Detta gÀller ocksÄ definitionen av anvÀndaren under vilken processerna körs. Det betyder att vi pÄ nÄgot sÀtt mÄste överföra UID (GID) in i containern.
För att anvÀnda externa variabler i Dockerfile anvÀnds direktiven och . En detaljerad jÀmförelse av direktiv .
Dockerfile
ARG UID=1000
ARG GID=1000
ENV UID=${UID}
ENV GID=${GID}
RUN usermod -u $UID node
&& groupmod -g $GID node
För att överföra argument via docker-compose kan du göra sÄ hÀr:
docker-compose
build:
context: ./src/backend
args:
UID: 1000
GID: 1000
P.S. För att bemÀstra alla finheter av docker rÀcker det inte att bara lÀsa dokumentationen eller artiklar. Du mÄste praktisera mycket, du behöver kÀnna pÄ docker.
KĂ€lla: habr.com
