web-dev-qa-db-fra.com

Exécuter un script dans Dockerfile

J'essaie d'exécuter un script pendant mon processus de construction dans mon fichier Docker. Mais cela ne semble pas fonctionner.

J'ai essayé de cette façon:

FROM php:7-fpm
ADD bootstrap.sh /
ENTRYPOINT ["/bin/bash", "/bootstrap.sh"]

Aussi de cette façon:

FROM php:7-fpm    
ADD bootstrap.sh /
RUN bash -c "/bootstrap.sh"

Et aussi en exécutant mon conteneur en cours d'exécution:

docker exec symfony /bin/bash -c "/bootstrap.sh"

Rien ne semble fonctionner.

Savez-vous comment le faire?

63
Kevin

RUN et ENTRYPOINT sont deux manières différentes d'exécuter un script.

RUN signifie qu'il crée un conteneur intermédiaire, exécute le script et fige le nouvel état de ce conteneur dans une nouvelle image intermédiaire. Le script ne sera pas exécuté après cela: votre image finale est supposée refléter le résultat de ce script.

ENTRYPOINT signifie que votre image (qui n'a pas encore exécuté le script) créera un conteneur et exécutera ce script.

Dans les deux cas, le script doit être ajouté et un _RUN chmod +x /bootstrap.sh_ est une bonne idée.

Il devrait également commencer par Shebang (comme _#!/bin/sh_)

Compte tenu de votre script ( KevinRaimbaud/docker-symfony/docker/php/bootstarp.sh : quelques commandes _git config --global_), il serait préférable d’exécuter ce script une fois dans votre fichier Docker, mais en veillant à utiliser le bon utilisateur ( le fichier de configuration global git est% HOME% /. gitconfig, qui par défaut est/root)

Ajouter à votre fichier Docker :

_RUN /bootstart.sh
_

Ensuite, lors de l'exécution d'un conteneur, vérifiez le contenu de _/root/.gitconfig_ pour confirmer que le script a été exécuté.

81
VonC

Essayez de créer un script avec la commande ADD et la spécification du répertoire de travail. Comme ceci ("script" est le nom du script et /root/script.sh est là où vous le voulez dans le conteneur, le chemin peut être différent:

ADD script.sh /root/script.sh

Dans ce cas, ADD doit précéder CMD, si vous avez un BTW, c'est une méthode intéressante pour importer des scripts dans n'importe quel emplacement du conteneur à partir de la machine hôte.

Dans CMD place [./script]

Il devrait exécuter automatiquement votre script

Vous pouvez également spécifier WORKDIR comme /root, vous serez automatiquement placé à la racine lors du démarrage d'un conteneur.

23
Michael

En plus des réponses ci-dessus:

Si vous avez créé/modifié votre fichier de script .sh sous Windows, assurez-vous qu'il a été enregistré avec une ligne se terminant au format Unix . Par défaut, de nombreux éditeurs Windows convertissent les fins de ligne Unix au format Windows et Linux ne reconnaît pas Shebang (#!/Bin/sh) au début du fichier. Donc, Linux produira le message d'erreur comme s'il n'y avait pas de Shebang.

Conseils:

  • Si vous utilisez Notepad ++, vous devez cliquer sur "Edition/Conversion EOL/UNIX (LF)".
  • Si vous utilisez Visual Studio, je vous conseillerais d'installer le plug-in " End Of Line ". Vous pouvez ensuite rendre les fins de ligne visibles en appuyant sur Ctrl-R, Ctrl-W. Et pour définir les fins de style Linux, vous pouvez appuyer sur Ctrl-R, Ctrl-L. Pour le style Windows, appuyez sur Ctrl-R, Ctrl-C.
10
VeganHunter