277 votes

point d'entrée docker exécutant bash script obtient "permission denied" (permission refusée)

J'essaie de dockeriser mon application node.js. Lorsque le conteneur est construit, je veux qu'il exécute une application git clone et ensuite démarrer le serveur de nœuds. Par conséquent, je mets ces opérations dans un script .sh. Et je lance le script comme une seule commande dans l'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 l'avoir exécutée :

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

J'y vais :

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

J'entre 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 bash script a-t-il une mauvaise syntaxe ?

  2. Comment changer la permission d'un fichier bash avant de l'ajouter dans une image ?

  3. Quelle est la meilleure façon d'exécuter plusieurs commandes git dans entrypoint sans utiliser un bash script ?

Merci.

0 votes

Nous devons voir les permissions des fichiers pour pouvoir répondre à cette question.

3 votes

BTW, si c'est un bash script, pas une sh script, un .sh laisse une impression trompeuse quant aux interprètes qui peuvent l'exécuter. Vous pourriez envisager de supprimer cette extension -- il n'est pas conventionnel pour les commandes UNIX d'avoir des extensions (vous n'exécutez pas ls.elf par exemple).

0 votes

Pouvons-nous exec une coquille de cette façon ? n'aurait-elle pas besoin de la bash préfixe.

8voto

Accorder des droits d'exécution au fichier docker-entrypoint.sh

sudo chmod 775 docker-entrypoint.sh

4voto

OZZIE Points 367

C'est peut-être un peu stupide, mais le message d'erreur que j'ai reçu était "Permission refusée" et cela m'a fait plonger dans une très mauvaise direction pour tenter de résoudre le problème. (Ici par exemple)

Je n'ai même pas ajouté de bash script moi-même, je pense qu'un est ajouté par nodejs image que j'utilise.

FROM node:14.9.0

J'étais à tort en cours d'exécution pour exposer/connecter le port sur mon local :

docker run -p 80:80 [name] . # this is wrong!

ce qui donne

/usr/local/bin/docker-entrypoint.sh: 8: exec: .: Permission denied

Mais vous ne devriez même pas avoir un point à la fin, il a été ajouté à la documentation de l'image docker d'un autre projet par misstake. Vous devez simplement exécuter :

docker run -p 80:80 [name]

J'aime beaucoup Docker mais c'est triste qu'il y ait autant d'écueils comme celui-ci et des messages d'erreur pas toujours très clairs...

3voto

user2506522 Points 38

Si vous le faites pas utiliser DockerFile, vous pouvez simplement ajouter la permission comme 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"

3voto

BradChesney79 Points 85

Il s'agit d'une vieille question posée deux ans avant ma réponse, mais je vais quand même publier ce qui a fonctionné pour moi.

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 pu rendre le fichier dans le conteneur docker exécutable en définissant le fichier à l'extérieur du conteneur comme exécutable. chmod 700 provision.sh puis en cours d'exécution docker build . .

0voto

James Bond Points 708

Si vous obtenez toujours Permission denied erreurs lorsque vous essayez d'exécuter votre script dans le point d'entrée du docker, essayez simplement de NE PAS utiliser le forme de coquille du point d'entrée :

Au lieu de : ENTRYPOINT ./bin/watcher écrire ENTRYPOINT ["./bin/watcher"] :

https://docs.docker.com/engine/reference/builder/#entrypoint

enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X