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:
Mon script bash a-t-il une mauvaise syntaxe?
Comment modifier l'autorisation d'un fichier bash avant de l'ajouter à une image?
Quel est le meilleur moyen d'exécuter plusieurs commandes git dans entrypoint sans utiliser de script bash?
Merci.
"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.
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.
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).
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.
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"]
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"
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 .
.