Gibt es eine einfache Möglichkeit, zu einem Nicht-Root-Benutzer im Bitbucket Pipelines Docker Container zu wechseln?

9

Bitbucket-Pipelines verwendet Docker-Container, um Aufgaben auszuführen, und Docker-Container werden standardmäßig als root ausgeführt. Dies ist ein Problem für die Lifecycle-Skripts von NPM, da NPM beim Ausführen von Skripts versucht, seine Berechtigungen herabzustufen.

Beim Ausführen des postinstall -Skripts gibt NPM einen Fehler aus , dass es cannot run in wd %s %s (wd=%s) ist. Die einfachste Lösung ist die Ausführung von npm install mit dem --unsafe-perm Flag, aber ich mag diesen Ansatz nicht.

Docker's Best Practices zum Schreiben von Dockerfiles besagt:

  

Wenn ein Service ohne Privilegien ausgeführt werden kann, verwenden Sie USER, um zu a zu wechseln   Nicht-root-Benutzer.

Beim Konfigurieren eines typischen Docker-Containers würde ich einen neuen Benutzer ohne Rootberechtigung erstellen und meine npm-Skripts als diesen Benutzer ausführen.

Nach dem Lesen der Pipelines-Dokumentation konnte ich keine Entsprechung finden zu Docker USER Befehl. Ich könnte useradd , chown und su verwenden (habe das noch nicht getestet), aber gibt es eine einfachere Lösung?

Das Hinzufügen von useradd , chown und su zu bitbucket-pipelines.yml script section unterbricht Pipelines und führt zum Fehlschlagen von repo:push webhook.

%Vor%

Pipelines antwortet mit

%Vor%     
Jakub Synowiec 22.08.2016, 11:03
quelle

3 Antworten

1

Die bequemste Lösung, die ich gefunden habe, besteht darin, ein Nicht-Root-Benutzerkonto nur dann zu erstellen, wenn es nicht bereits im Bild enthalten ist und das verwendet gosu Dienstprogramm, um es für ausgeführte Befehle zu setzen.

Pipelines ' build step setzt bereits chmod 777 auf $BUILD_DIR , so dass zusätzliche chown nicht benötigt werden.

Um im Container Bitbucket Pipelines Docker zu einem Benutzer ohne Rootberechtigung wechseln zu können, müssen Sie:

  1. fügen Sie Ihrem Repository ein zusätzliches Shell-Skript hinzu, das das Dienstprogramm gosu installiert (es kann auch direkt als Schritt in der Pipelies-Konfiguration eingefügt werden)
  2. rufen Sie das Skript install-gosu.sh als ersten Schritt in der Pipelines-Konfiguration
  3. auf
  4. Erstellen Sie einen Benutzer ohne root (der prüft, ob er bereits existiert) mit id -u {user} &>/dev/null || useradd ... ,
  5. Verwenden Sie gosu, um Befehle als Nicht-Root-Benutzer auszuführen.

install-gosu.sh

%Vor%

bitbucket-pipelines.yml

%Vor%

Dies kann leicht für andere Sprachen / Benutzer / Befehle angepasst werden. Tauschen Sie einfach die Befehle node user und npm auf das aus, was Sie brauchen.

Ich habe diese Methode mit nodejs und python images getestet.

    
Jakub Synowiec 23.03.2017, 23:05
quelle
2

Es gibt zwei Dinge in dieser Frage zu behandeln.

Um als Benutzer ohne Rootberechtigung in Bitbucket-Pipelines ausgeführt zu werden, können Sie genau das tun, was Sie vorgeschlagen haben, und den USER-Docker-Befehl verwenden. Der Knoten: 6.2 image wird nicht einem Benutzer ohne Rootberechtigung zugeordnet. Wenn Sie dies möchten, können Sie ein neues Docker-Image mit der folgenden Docker-Datei erstellen:

%Vor%

Der 500-Fehler, den Sie erhalten, scheint ein Problem zu sein, wenn YAML in dieser Zeile analysiert:

%Vor%

Das ':' ist ein Sonderzeichen im YAML-Format. Ein Schlüssel-Wert-Paar anzeigen. Um dies zu beheben, setzen Sie den Inhalt stattdessen in Anführungszeichen wie folgt:

%Vor%

Ich würde auch vorschlagen, dass Sie jetzt die neue Standard-Umgebungsvariable für den Build-Pfad verwenden. $ BITBUCKET_CLONE_DIR. Ändern Sie die Zeile stattdessen zu

%Vor%     
phod 12.10.2016 13:37
quelle
1

Da das Knotenabbild bereits einen Knotenbenutzer erstellt (mindestens 6.9+), benötigen Sie nicht useradd . Es scheint auch ohne das Chown gut zu funktionieren. Am Ende habe ich ein Skript, das so aussieht - und es scheint gut zu sein:

%Vor%     
Konrad Garus 05.01.2017 08:07
quelle