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
,--system
Erstellen Sie ein Systemkonto.-m
,--create-home
Erstellen Sie das Home-Verzeichnis des Benutzers.-d
,--home-dir HOME_DIR
Home-Verzeichnis des neuen Kontos.-s
,--shell SHELL
Login-Shell des neuen Kontos.-g
,--gid GROUP
Name oder ID der primären Gruppe.-G
,--groups GROUPS
Liste der Zusatzgruppen.-u
,--uid UID
Benutzer-ID angeben.-p
,--password PASSWORD
Verschlü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