it-swarm.com.de

docker entrypoint running bash script erhält "erlaubnis verweigert"

Ich versuche, meine node.js-App zu dockerisieren. Wenn der Container gebaut ist, möchte ich, dass er ein git clone und starten Sie dann den Knotenserver. Deshalb habe ich diese Operationen in ein .sh-Skript geschrieben. Führen Sie das Skript als einzelnen Befehl in 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"] 

Mein docker-entrypoint.sh sieht so aus:

git clone [email protected]<repo>.git
git add remote upstream [email protected]<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.

I Shell 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:

  1. Hat mein Bash-Skript eine falsche Syntax?

  2. Wie ändere ich die Berechtigung einer Bash-Datei, bevor ich sie einem Bild hinzufüge?

  3. Was ist die beste Möglichkeit, mehrere Git-Befehle in Entrypoint auszuführen, ohne ein Bash-Skript zu verwenden?

Vielen Dank.

78
Calvin Hu
  1. "Berechtigung verweigert" verhindert, dass Ihr Skript aufgerufen wird überhaupt. Daher ist die einzige Syntax, die möglicherweise relevant sein könnte, die der ersten Zeile (der "Shebang"), die wie folgt aussehen sollte: #!/usr/bin/env bash, oder #!/bin/bash oder ähnlich, abhängig vom Dateisystemlayout Ihres Ziels.

  2. Höchstwahrscheinlich sind die Dateisystemberechtigungen nicht für die Ausführung festgelegt. Es ist auch möglich, dass der Shebang auf etwas verweist, das nicht ausführbar ist, aber dies ist weit weniger wahrscheinlich.

  3. Gestritten von der Leichtigkeit, frühere Probleme zu beheben.


Das einfache Lesen von

docker: Error response from daemon: oci runtime error: exec: "/usr/src/app/docker-entrypoint.sh": permission denied.

... ist, dass das Skript nicht als ausführbar markiert ist.

RUN ["chmod", "+x", "/usr/src/app/docker-entrypoint.sh"]

wird dies innerhalb des Containers ansprechen. Alternativ können Sie stellen Sie sicher, dass die lokale Kopie, auf die von der Docker-Datei verwiesen wird, ausführbar ist und dann COPY (das explizit dokumentiert ist, um Metadaten beizubehalten) verwenden.

124
Charles Duffy

Für eine ausführbare Datei müssen Berechtigungen zum Ausführen 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:

ls -la path/to/directory

In der ersten Spalte der Ausgabe Ihrer ausführbaren Datei (in diesem Fall docker-entrypoint.sh) sollten die ausführbaren Bits wie folgt gesetzt sein:

-rwxrwxr-x

Wenn nicht, dann versuchen Sie:

chmod +x docker-entrypoint.sh

und erstellen Sie dann Ihr Docker-Image erneut.

Docker verwendet ein eigenes Dateisystem, kopiert jedoch alles (einschließlich der Berechtigungsbits) aus den Quellverzeichnissen.

33
Sami Start

Ich hatte das gleiche Problem und es wurde von behoben

ENTRYPOINT ["sh", "/docker-entrypoint.sh"]

Für das Dockerfile in der ursprünglichen Frage sollte es so aussehen:

ENTRYPOINT ["sh", "/usr/src/app/docker-entrypoint.sh"]
4
Saurabhcdt

Wenn Sie nicht DockerFile verwenden, können Sie einfach die Berechtigung als Befehlszeilenargument der Bash hinzufügen:

docker run -t <image>  /bin/bash -c "chmod +x /usr/src/app/docker-entrypoint.sh; /usr/src/app/docker-entrypoint.sh"
0
betontalpfa

Dies ist eine alte Frage, die zwei Jahre vor meiner Antwort gestellt wurde. Ich werde auf jeden Fall posten, was für mich funktioniert hat.

In meinem Arbeitsverzeichnis habe ich zwei Dateien: Dockerfile & provision.sh

Dockerfile:

FROM centos:6.8

# put the script in the /root directory of the container
COPY provision.sh /root

# execute the script inside the container
RUN /root/provision.sh

EXPOSE 80

# Default command
CMD ["/bin/bash"]

provision.sh:

#!/usr/bin/env bash

yum upgrade

Ich konnte die Datei im Docker-Container ausführbar machen, indem ich die Datei außerhalb des Containers als ausführbar einstellte chmod 700 provision.sh Und dann docker build . Ausführte.

0
BradChesney79