Exécuter un script dans Dockerfile

93

J'essaye d'exécuter un script pendant mon processus de construction dans mon Dockerfile. 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 faire?

Kevin
la source
Le bootstarp.shbit exécutable est-il défini?
jwodder
Comme ça RUN chmod + x /bootstarp.sh?
Kevin
2
Avec "ne fonctionne pas", que se passe-t-il exactement? Affiche-t-il une erreur? Le fichier est-il présent à l'intérieur de l'image? Si vous êtes docker exec -it symfony bashà l'intérieur du conteneur, pouvez-vous exécuter manuellement le script et vérifier son contenu? ( cat bootstarp.sh)?
thaJeztah
essayez ceci: docker exec symfony /bin/bash /bootstarp.shet faites-moi savoir la sortie.
Boynux
12
Ermahgerd bootstarp!
Bruno Bronosky

Réponses:

128

RUNet ENTRYPOINTsont deux manières différentes d'exécuter un script.

RUNsignifie 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 censé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.shest une bonne idée.

Cela devrait aussi commencer par un shebang (comme #!/bin/sh)

Compte tenu de votre script ( bootstarp.sh: quelques git config --globalcommandes), il serait préférable d'utiliser RUNce script une fois dans votre Dockerfile, mais en veillant à utiliser le bon utilisateur (le git configfichier global est %HOME%/.gitconfig, qui par défaut est /rootcelui)

Ajoutez à votre Dockerfile:

RUN /bootstart.sh

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

VonC
la source
5
En outre, vous pourriez avoir voulu dire bootstrap.shau lieu de bootstarp.sh: voir stackoverflow.com/a/1254561/6309
VonC
Cool! Fonctionne très bien avec RUN /bootstrap.sh
Kevin
1
Le shebang sur la première ligne l'a fait pour moi, merci! :)
GDICommander
34

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 sous Windows convertiront les fins de ligne Unix au format Windows et Linux ne reconnaîtra pas shebang (#! / Bin / sh) au début du fichier. Ainsi Linux produira le message d'erreur comme s'il n'y avait pas de shebang.

Conseils:

  • Si vous utilisez Notepad ++, vous devez cliquer sur "Edit / EOL Conversion / UNIX (LF)"
  • Si vous utilisez Visual Studio, je vous suggère d'installer le plugin " End Of Line ". Ensuite, vous pouvez rendre les fins de ligne visibles en appuyant sur Ctrl-R, Ctrl-W. Et pour définir des fins de style Linux, vous pouvez appuyer sur Ctrl-R, Ctrl-L. Pour le style Windows, appuyez sur Ctrl-R, Ctrl-C.
VeganHunter
la source
4
Wow, tu as sauvé ma journée. Merci pour ça.
mw
2
Brillant! c'était mon problème EXACT!
Kevinsyel
1
Mon VSCode avait automatiquement défini les fins alignées d'un script shell sur CRLF dans Windows. La construction du docker échouait à cause de certains caractères aléatoires. J'ai changé les paramètres dans VS Code et cela a immédiatement commencé à fonctionner. Merci! J'ai voté pour.
Adithya Upadhya
24

Essayez de créer un script avec la ADDcommande et la spécification du répertoire de travail Comme ceci ("script" est le nom du script et /root/script.shest l'endroit où vous le souhaitez dans le conteneur, il peut s'agir d'un chemin différent:

ADD script.sh /root/script.sh

Dans ce cas ADDdoit venir avant CMD, si vous avez un BTW, c'est un moyen cool d'importer des scripts vers n'importe quel emplacement du conteneur à partir de la machine hôte

En CMDplace[./script]

Il devrait exécuter automatiquement votre script

Vous pouvez également spécifier WORKDIRcomme /root, alors vous serez automatiquement placé en racine, au démarrage d'un conteneur

Michael
la source
Comment docker identifie-t-il l'emplacement de script.sh au début? Je veux dire, le premier paramètre,script.sh
couchers de soleil
puisque vous construisez des conteneurs, vous êtes également en charge de placer les chemins
Michael
le chemin et le nom du premier paramètre script.shsont relatifs auDockerfile
eja
4

Il est recommandé de l'utiliser COPYplutôt que ADDlorsque vous copiez du système de fichiers local vers l'image. En outre, je vous recommande de créer un sous-dossier dans lequel placer votre contenu. Si rien d'autre, cela garde les choses en ordre. Assurez-vous de marquer le script comme exécutable à l'aide de chmod.

Ici, je crée un scriptssous-dossier dans lequel placer mon script et l'exécuter à partir de:

RUN mkdir -p /scripts
COPY script.sh /scripts
WORKDIR /scripts
RUN chmod +x script.sh
RUN script.sh
ldobson
la source