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 :
-
Mon bash script a-t-il une mauvaise syntaxe ?
-
Comment changer la permission d'un fichier bash avant de l'ajouter dans une image ?
-
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 pasls.elf
par exemple).0 votes
Pouvons-nous
exec
une coquille de cette façon ? n'aurait-elle pas besoin de labash
préfixe.0 votes
@Jean-FrançoisFabre, que voulez-vous dire exactement par votre question ? (Je ne comprends pas ce que signifie "exécuter un shell de cette façon" -- qu'est-ce que "de cette façon" dans ce contexte ?)
2 votes
Question stupide, d'ailleurs - les permissions du script sont-elles correctes ? avant vous les ajoutez à l'image ?
0 votes
(...btw, éditer une question de manière à ce qu'une réponse donnée précédemment n'ait plus de sens est un peu mal vu).
0 votes
Je veux dire : si j'effectue une exécution d'un script qui n'est pas dans un shell, il refuse de s'exécuter. Cela fonctionne si l'exec utilise un shell pour s'exécuter. Mais peut-être que c'est déjà couvert.
0 votes
@Jean-FrançoisFabre, c'est quelque chose qui arrive quand on n'a pas un shebang valide : De nombreux shells supposent qu'un fichier dont le bit exécutable est activé mais qui n'a pas de shebang valide (pour lequel l'option
execv
échoue, ce qui signifie que le système d'exploitation ne peut pas trouver comment l'exécuter) devrait être exécuté comme un script avec ce shell lui-même, et se rabattra sur cette façon de faire, mais le système d'exploitation ne fera pas cette supposition et refusera simplement d'exécuter le contenu sans un shebang approprié.0 votes
@Jean-FrançoisFabre, ...donc, le mécanisme simple pour éviter ce comportement est de s'assurer que vos scripts commencent toujours par
#!/bin/bash
(si bash),#!/bin/sh
(si POSIX sh), etc.0 votes
J'ai rencontré un problème similaire. Cependant, en exécutant
RUN ["chmod", "+x", "/usr/src/app/docker-entrypoint.sh"]
ne fonctionne pas pour moi. Il ne fonctionne que lorsque je change la permission de mon répertoire source local. Je ne sais pas pourquoi je ne peux pas modifier l'autorisation de l'exécutable à partir de Dockerfile. Quelqu'un a-t-il rencontré le même problème ?