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.
Pipelines antwortet mit
%Vor%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:
install-gosu.sh
als ersten Schritt in der Pipelines-Konfiguration id -u {user} &>/dev/null || useradd ...
, 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.
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% 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:
Tags und Links node.js continuous-integration docker bitbucket bitbucket-pipelines