Der Trick besteht darin, useradd zu verwenden anstelle seines interaktiven Wrappers adduser .Benutzer erstelle ich normalerweise mit:
RUN useradd -ms /bin/bash newuser
Dadurch wird ein Home-Verzeichnis für den Benutzer erstellt und sichergestellt, dass bash die Standard-Shell ist.
Sie können dann hinzufügen:
USER newuser
WORKDIR /home/newuser
zu Ihrer Dockerdatei. Jeder nachfolgende Befehl sowie interaktive Sitzungen werden als Benutzer newuser ausgeführt :
docker run -t -i image
[email protected]:~$
Möglicherweise müssen Sie newuser eingeben die Berechtigungen zum Ausführen der Programme, die Sie ausführen möchten, bevor Sie den Benutzerbefehl aufrufen.
Die Verwendung von nicht privilegierten Benutzern innerhalb von Containern ist aus Sicherheitsgründen eine gute Idee. Es hat auch ein paar Nachteile. Am wichtigsten ist, dass Personen, die Bilder von Ihrem Bild ableiten, wieder zum Root wechseln müssen, bevor sie Befehle mit Superuser-Rechten ausführen können.
Das Hinzufügen von Benutzern im Docker und das Ausführen Ihrer App unter diesem Benutzer ist aus Sicherheitsgründen eine sehr gute Vorgehensweise. Dazu würde ich die folgenden Schritte empfehlen:
FROM node:10-alpine
# Copy source to container
RUN mkdir -p /usr/app/src
# Copy source code
COPY src /usr/app/src
COPY package.json /usr/app
COPY package-lock.json /usr/app
WORKDIR /usr/app
# Running npm install for production purpose will not run dev dependencies.
RUN npm install -only=production
# Create a user group 'xyzgroup'
RUN addgroup -S xyzgroup
# Create a user 'appuser' under 'xyzgroup'
RUN adduser -S -D -h /usr/app/src appuser xyzgroup
# Chown all the files to the app user.
RUN chown -R appuser:xyzgroup /usr/app
# Switch to 'appuser'
USER appuser
# Open the mapped port
EXPOSE 3000
# Start the process
CMD ["npm", "start"]
Die obigen Schritte sind ein vollständiges Beispiel für das Kopieren von NodeJS-Projektdateien, das Erstellen einer Benutzergruppe und eines Benutzers, das Zuweisen von Berechtigungen für den Benutzer für den Projektordner, das Wechseln zum neu erstellten Benutzer und das Ausführen der App unter diesem Benutzer.
Ubuntu
Versuchen Sie die folgenden Zeilen in Dockerfile :
RUN useradd -rm -d /home/ubuntu -s /bin/bash -g root -G sudo -u 1001 ubuntu
USER ubuntu
WORKDIR /home/ubuntu
useradd Optionen (siehe:man useradd ):
-r,--systemErstellen Sie ein Systemkonto.-m,--create-homeErstellen Sie das Home-Verzeichnis des Benutzers.-d,--home-dir HOME_DIRHome-Verzeichnis des neuen Kontos.-s,--shell SHELLLogin-Shell des neuen Kontos.-g,--gid GROUPName oder ID der primären Gruppe.-G,--groups GROUPSListe der Zusatzgruppen.-u,--uid UIDBenutzer-ID angeben.-p,--password PASSWORDVerschlüsseltes Passwort des neuen Accounts (z.B.ubuntu).
Passwort des Standardbenutzers festlegen
Um das Benutzerkennwort festzulegen, fügen Sie -p "$(openssl passwd -1 ubuntu)" hinzu bis useradd Befehl.
Alternativ fügen Sie Ihrem Dockerfile die folgenden Zeilen hinzu :
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
RUN echo 'ubuntu:ubuntu' | chpasswd
Die erste Shell-Anweisung besteht darin, sicherzustellen, dass -o pipefail Option ist vor RUN aktiviert mit einem Rohr drin. Lesen Sie mehr:Hadolint:Linting your Dockerfile.
Um die interaktiven Fragen von adduser zu vermeiden, können Sie es mit diesen Parametern aufrufen:
RUN adduser --disabled-password --gecos '' newuser
Der --gecos Mit dem Parameter werden die Zusatzinformationen eingestellt. In diesem Fall ist es einfach leer.
Verwenden Sie auf Systemen mit Busybox (wie Alpine)
RUN adduser -D -g '' newuser
Siehe busybox adduser