Ich versuche, meine node.js-App anzudocken. Wenn der Container erstellt ist, soll er a ausführen git clone
und dann den Knotenserver starten. Deshalb habe ich diese Operationen in ein .sh-Skript eingefügt. Führen Sie das Skript als einzelnen Befehl im ENTRYPOINT aus:
FROM ubuntu:14.04
RUN apt-get update && apt-get install -y build-essential libssl-dev gcc curl npm git
#install gcc 4.9
RUN apt-get install -y software-properties-common python-software-properties
RUN add-apt-repository -y ppa:ubuntu-toolchain-r/test
RUN apt-get update
RUN apt-get install -y libstdc++-4.9-dev
#install newst nodejs
RUN curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash -
RUN apt-get install -y nodejs
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
ADD package.json /usr/src/app/
RUN npm install
ADD docker-entrypoint.sh /usr/src/app/
EXPOSE 8080
ENTRYPOINT ["/usr/src/app/docker-entrypoint.sh"]
Meine docker-entrypoint.sh sieht folgendermaßen aus:
git clone git@<repo>.git
git add remote upstream git@<upstream_repo>.git
/usr/bin/node server.js
Nachdem Sie dieses Image erstellt und ausgeführt haben:
docker run --env NODE_ENV=development -p 8080:8080 -t -i <image>
Ich erhalte:
docker: Error response from daemon: oci runtime error: exec: "/usr/src/app/docker-entrypoint.sh": permission denied.
Ich schalte in den Container und die Erlaubnis von docker-entrypoint.sh ist:
-rw-r--r-- 1 root root 292 Aug 10 18:41 docker-entrypoint.sh
drei Fragen:
Hat mein Bash-Skript eine falsche Syntax?
Wie ändere ich die Berechtigung einer Bash-Datei, bevor ich sie einem Bild hinzufüge?
Was ist der beste Weg, um mehrere Git-Befehle in Entrypoint auszuführen, ohne ein Bash-Skript zu verwenden?
Vielen Dank.
.sh
hinterlässt eine Erweiterung einen irreführenden Eindruck darüber, welche Dolmetscher es ausführen können. Sie könnten in Betracht ziehen, dies herauszunehmen - es ist nicht üblich, dass UNIX-Befehle Erweiterungen haben (Sie werden beispielsweise nicht ausgeführtls.elf
).exec
eine Muschel? würde es nicht dasbash
Präfix brauchen .Antworten:
„Zugriff verweigert“ verhindert , dass Ihr Skript aus aufgerufen wird überhaupt . Somit ist die einzige Syntax , die möglicherweise relevant sein könnten , ist , dass von der ersten Zeile (der „Shebang“), die aussehen sollte
#!/usr/bin/env bash
, oder#!/bin/bash
, oder ähnlich je nach Zieldateisystem - Layout.Höchstwahrscheinlich sind die Dateisystemberechtigungen nicht so festgelegt, dass sie ausgeführt werden können. Es ist auch möglich, dass der Shebang auf etwas verweist, das nicht ausführbar ist, aber dies ist weitaus weniger wahrscheinlich.
Beflügelt von der einfachen Reparatur der vorherigen Probleme.
Das einfache Lesen von
... ist, dass das Skript nicht als ausführbar markiert ist.
wird dies innerhalb des Containers ansprechen. Alternativ können Sie sicherstellen, dass die lokale Kopie, auf die in der Docker-Datei verwiesen wird, ausführbar ist , und diese dann verwenden
COPY
(die explizit dokumentiert ist, um Metadaten beizubehalten).quelle
noexec
Flag ausführen möchten , führen Siebash yourscript
stattdessen aus./yourscript
.docker build
den sofortigen Container laufen lasse, funktioniert einwandfrei. Aber wenn ich das tuedocker run
, wirft es einen solchen Fehler. Scheint wie ein magischer Zwischenbehälter, den ich habe.Für eine ausführbare Datei müssen Berechtigungen für die Ausführung festgelegt sein, bevor Sie sie ausführen können.
Versuchen Sie auf Ihrem Computer, auf dem Sie das Docker-Image erstellen (nicht im Docker-Image selbst), Folgendes auszuführen:
In der ersten Spalte der Ausgabe für Ihre ausführbare Datei (in diesem Fall docker-entrypoint.sh) sollten die ausführbaren Bits wie folgt gesetzt sein:
Wenn nicht, versuchen Sie:
und erstellen Sie dann Ihr Docker-Image erneut.
Docker verwendet ein eigenes Dateisystem, kopiert jedoch alles (einschließlich der Berechtigungsbits) aus den Quellverzeichnissen.
quelle
chmod +x docker-entrypoint.sh
auf dem Host ist eigentlich die empfohlene Lösung, da es viel einfacher ist, als Ihre zu ändernDockerfile
.Ich hatte das gleiche Problem und es wurde gelöst von
Für das Dockerfile in der ursprünglichen Frage sollte es wie folgt aussehen:
quelle
sh
und ignoriert die Shebang-Spezifikation eines Interpreters. Wenn es also verwendet#!/bin/bash
und sagt, dass es mit Bash interpretiert werden soll, wird dies ignoriert undsh
stattdessen mit interpretiert , wodurch Sprachfunktionen wie[[ ]]
Arrays usw. nicht zugelassen werden.Wenn Sie DockerFile nicht verwenden, können Sie einfach die Berechtigung als Befehlszeilenargument der Bash hinzufügen:
quelle
Dies ist eine alte Frage, die zwei Jahre vor meiner Antwort gestellt wurde. Ich werde veröffentlichen, was sowieso für mich funktioniert hat.
In meinem Arbeitsverzeichnis befinden sich zwei Dateien: Dockerfile & provision.sh
Dockerfile:
provision.sh:
Ich konnte die Datei im Docker-Container ausführbar machen, indem ich die Datei außerhalb des Containers als ausführbar festlegte und
chmod 700 provision.sh
dann ausführtedocker build .
.quelle