Alla processer i behållaren kommer att köras som rotanvändare, om du inte anger det på ett speciellt sätt. Detta verkar väldigt bekvämt, eftersom denna användare inte har några begränsningar. Det är därför det är fel att arbeta som root ur säkerhetssynpunkt. Om ingen med sitt fulla sinne arbetar på den lokala datorn med roträttigheter, så kör många processer under root i containrar.
Det finns alltid buggar som gör att skadlig programvara kan fly från behållaren och komma in på värddatorn. Om vi antar det värsta måste vi se till att processer inuti behållaren körs av en användare som inte har några rättigheter på värddatorn.
Skapa en användare
Att skapa en användare i en behållare skiljer sig inte från att skapa den i Linux-distributioner. Kommandona kan dock variera för olika basbilder.
För debianbaserade distributioner måste du lägga till följande i Dockerfilen:
RUN groupadd --gid 2000 node
&& useradd --uid 2000 --gid node --shell /bin/bash --create-home node
För alpint:
RUN addgroup -g 2000 node
&& adduser -u 2000 -G node -s /bin/sh -D node
Köra processer från användaren
För att köra alla efterföljande processer som en användare med UID 2000, kör:
USER 2000
För att köra alla efterföljande processer som nodanvändare, kör:
USER node
Läs mer i
Monteringsvolymer
När du monterar volymer inuti en behållare, ge användaren möjlighet att läsa och/eller skriva filer. För att göra detta måste UID (GID) för användaren i behållaren och användaren utanför behållaren som har lämpliga behörigheter för att komma åt filen matcha. I det här fallet spelar användarnamn ingen roll.
Ofta på en Linux-dator är en användares UID och GID lika med 1000. Dessa identifierare tilldelas den första användaren av datorn.
Det är enkelt att ta reda på dina identifierare:
id
Du kommer att få omfattande information om din användare.
Byt ut 2000 från exemplen med din identifierare så blir allt bra.
Tilldela ett UID och GID till en användare
Om användaren skapades tidigare, men du behöver ändra identifierarna, kan du göra det så här:
RUN usermod -u 1000 node
&& groupmod -g 1000 node
Om du använder den alpina basbilden måste du installera shadow-paketet:
RUN apk add —no-cache shadow
Skickar användar-ID inuti behållaren när bilden byggs
Om ditt ID och ID:n för alla personer som arbetar med projektet stämmer överens, ange bara detta ID i Dockerfilen. Men ofta stämmer inte användar-ID:n.
Hur man uppnår det man vill är inte direkt klart. För mig var detta det svåraste i processen att bemästra Docker. Många docker-användare inser inte att det finns olika stadier i en bilds liv. Först sätts bilden ihop med en Dockerfile. När du kör en behållare från en bild används dockerfilen inte längre.
Användarskapandet måste ske när bilden byggs. Detsamma gäller för att bestämma den användare under vilken processer startas. Det betyder att vi på något sätt måste skicka UID (GID) inuti behållaren.
Direktiv används för att använda externa variabler i Dockerfilen
Dockerfile
ARG UID=1000
ARG GID=1000
ENV UID=${UID}
ENV GID=${GID}
RUN usermod -u $UID node
&& groupmod -g $GID node
Du kan skicka argument via docker-compose så här:
docker-compose
build:
context: ./src/backend
args:
UID: 1000
GID: 1000
PS För att bemästra alla krångligheterna med Docker räcker det inte att läsa dokumentationen eller artiklarna. Du behöver öva mycket, du måste få en känsla för Docker.
Källa: will.com