web-dev-qa-db-fra.com

Le script bash en cours d'exécution du docker entrypoint obtient "l'autorisation refusée"

J'essaie de dockerize mon application node.js. Une fois le conteneur créé, je souhaite qu’il exécute un git clone puis lance le serveur de nœud. Par conséquent, je mets ces opérations dans un script .sh. Et exécutez le script en tant que commande unique dans ENTRYPOINT:

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"] 

Mon docker-entrypoint.sh ressemble à ceci:

git clone git@<repo>.git
git add remote upstream git@<upstream_repo>.git

/usr/bin/node server.js

Après avoir construit cette image et exécuté:

docker run --env NODE_ENV=development -p 8080:8080 -t -i <image>

Je suis en train:

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

Je shell dans le conteneur et la permission de docker-entrypoint.sh est:

-rw-r--r-- 1 root root 292 Aug 10 18:41 docker-entrypoint.sh

trois questions:

  1. Mon script bash a-t-il une mauvaise syntaxe?

  2. Comment modifier l'autorisation d'un fichier bash avant de l'ajouter à une image?

  3. Quel est le meilleur moyen d'exécuter plusieurs commandes git dans entrypoint sans utiliser de script bash?

Merci.

78
Calvin Hu
  1. "Autorisation refusée" empêche votre script d'être appelé du tout. Ainsi, la seule syntaxe qui pourrait être éventuellement pertinente est celle de la première ligne (le "Shebang"), qui devrait ressembler à #!/usr/bin/env bash, ou #!/bin/bash, ou similaire, selon la disposition du système de fichiers de votre cible.

  2. Il est fort probable que les autorisations du système de fichiers ne soient pas configurées pour autoriser l'exécution. Il est également possible que le Shebang fasse référence à quelque chose qui n’est pas exécutable, mais cela est loin moins probable.

  3. Mooted par la facilité de réparer les problèmes précédents.


La simple lecture de

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

... est que le script n'est pas marqué comme exécutable.

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

adressera cela dans le conteneur. Sinon, vous pouvez assurez-vous que la copie locale référencée par le fichier Dockerfile est exécutable, puis utilisez COPY (explicitement documenté pour conserver les métadonnées).

124
Charles Duffy

Un fichier exécutable doit disposer d'autorisations d'exécution avant de pouvoir être exécuté.

Dans votre machine où vous construisez l'image de menu fixe (pas à l'intérieur de l'image de menu fixe elle-même), exécutez la commande suivante:

ls -la path/to/directory

La première colonne de la sortie de votre exécutable (dans ce cas, docker-entrypoint.sh) devrait avoir les bits exécutables définis comme suit:

-rwxrwxr-x

Si non, alors essayez:

chmod +x docker-entrypoint.sh

et construisez ensuite à nouveau votre image de menu fixe.

Docker utilise son propre système de fichiers, mais il copie tout (y compris les bits d’autorisation) des répertoires source.

33
Sami Start

J'ai fait face au même problème et résolu par

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

Pour le fichier Docker dans la question initiale, cela devrait ressembler à:

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

Si vous utilisez pas utilisez DockerFile, vous pouvez simplement ajouter une permission en tant qu'argument de ligne de commande du bash:

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

C'est une vieille question posée deux ans avant ma réponse, je vais publier ce qui a fonctionné pour moi de toute façon.

Dans mon répertoire de travail, j'ai deux fichiers: 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

J'ai été en mesure de rendre le fichier exécutable dans le conteneur de menu fixe en le définissant comme fichier exécutable chmod 700 provision.sh, puis en exécutant docker build ..

0
BradChesney79