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.

358voto

Charles Duffy Points 34134
  1. "Permission refusée" empêche l'appel de votre script. du tout . Ainsi, la seule syntaxe qui pourrait être pertinente est celle de la première ligne (le "shebang"), qui devrait ressembler à ceci #!/usr/bin/env bash ou #!/bin/bash ou similaire, en fonction de la disposition du système de fichiers de votre cible.

  2. Il est probable que les autorisations du système de fichiers ne soient pas définies pour permettre l'exécution. Il est également possible que le shebang fasse référence à quelque chose qui n'est pas exécutable, mais c'est le cas. loin moins probable.

  3. Rendue caduque par la facilité de réparation des problèmes antérieurs.


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é exécutable.

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

abordera cette question dans le conteneur. Alternativement, vous pouvez s'assurer que la copie locale référencée par le Dockerfile est exécutable et ensuite utiliser COPY (qui est explicitement documenté pour conserver les métadonnées).

0 votes

Je pense que vous avez raison. Je devrais utiliser COPY à la place. Mais il semble que je doive encore changer la permission après avoir copié le bash script.

0 votes

J'ai un fichier phar qui crée des .bash scripts basés sur une commande, puis les supprime une fois qu'ils ont terminé. Donc, la nécessité pour les volumes partagés d'avoir la permission d'exécution définie est quelque chose avec laquelle je me bats encore.

2 votes

@raupie, si vous voulez exécuter un script à partir d'un point de montage avec la commande noexec drapeau, exécuter bash yourscript au lieu de ./yourscript .

94voto

Sami Start Points 505

Un fichier exécutable doit avoir les autorisations d'exécution définies avant que vous puissiez l'exécuter.

Dans votre machine où vous construisez l'image docker (pas dans l'image docker elle-même), essayez d'exécuter :

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 de l'exécutable définis comme suit :

-rwxrwxr-x

Si ce n'est pas le cas, essayez :

chmod +x docker-entrypoint.sh

puis recompilez votre image docker.

Docker utilise son propre système de fichiers, mais il copie tout (y compris les bits de permissions) à partir des répertoires sources.

30 votes

chmod +x docker-entrypoint.sh sur l'hôte est en fait la solution recommandée, car elle est beaucoup plus simple que de changer votre Dockerfile .

0 votes

Cela a marché pour moi. Mais je n'ai pas vraiment compris pourquoi xD. Si vous, lecteur, vous retrouvez dans cette situation à un moment donné, j'apprécierais que vous m'expliquiez pourquoi.

1 votes

Si vous avez un système de fichiers compatible posix (c'est-à-dire que vous utilisez macos ou linux ou un autre bsd), votre docker copiera les droits de l'hôte. sous Windows, par exemple, vous n'avez pas ces droits, donc il les ajoutera simplement.

54voto

Saurabhcdt Points 31

J'ai rencontré le même problème et il a été résolu par

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

Pour le Dockerfile de la question originale, cela devrait être comme suit :

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

9 votes

Il s'agit d'une solution de contournement, mais pas d'une grande - cela interprète le script avec sh en ignorant la spécification d'un interpréteur dans son shebang ; ainsi, s'il utilise #!/bin/bash en disant qu'il veut être interprété avec bash, cela sera ignoré et il sera interprété avec sh à la place, ce qui empêche l'utilisation de caractéristiques linguistiques telles que [[ ]] , tableaux, etc.

1 votes

J'ai utilisé votre approche et ça a marché. Peut-être que dos2unix fait aussi l'affaire

0 votes

Cette approche est celle qui a fonctionné pour moi. Je me demande quelle en est la raison.

39voto

rumbarum Points 11

Le problème est dû à le fichier original n'a pas la permission d'exécution.

Vérifiez que le fichier original a la permission.

exécuter ls -al

Si le résultat est -rw-r--r-- ,

exécuter
chmod +x docker-entrypoint.sh

avant la construction du docker !

22voto

Abd Abughazaleh Points 75

Retirer le point [.]

Ce problème m'a pris plus de 3 heures finalement, je viens d'essayer le problème était dans l'enlèvement point de la fin juste.

Le problème était

docker run  -p 3000:80 --rm --name test-con test-app .

/usr/local/bin/docker-entrypoint.sh : 8 : exec : .. : Permission refusée

retirez simplement point à la fin de votre ligne de commande :

docker run  -p 3000:80 --rm --name test-con test-app

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