J'ai un répertoire ne contenant que deux fichiers, Dockerfile
et sayhello.sh
:
.
├── Dockerfile
└── sayhello.sh
Le Dockerfile
lit
FROM Alpine
COPY sayhello.sh sayhello.sh
CMD ["sayhello.sh"]
et sayhello.sh
contient simplement
echo hello
Le Dockerfile
construit avec succès:
kurtpeek@Sophiemaries-MacBook-Pro ~/d/s/trybash> docker build --tag trybash .
Sending build context to Docker daemon 3.072 kB
Step 1/3 : FROM Alpine
---> 665ffb03bfae
Step 2/3 : COPY sayhello.sh sayhello.sh
---> Using cache
---> fe41f2497715
Step 3/3 : CMD sayhello.sh
---> Using cache
---> dfcc26c78541
Successfully built dfcc26c78541
Cependant, si j'essaie de run
il me donne un executable file not found in $PATH
Erreur:
kurtpeek@Sophiemaries-MacBook-Pro ~/d/s/trybash> docker run trybash
container_linux.go:247: starting container process caused "exec: \"sayhello.sh\": executable file not found in $PATH"
docker: Error response from daemon: oci runtime error: container_linux.go:247: starting container process caused "exec: \"sayhello.sh\": executable file not found in $PATH".
ERRO[0001] error getting events from daemon: net/http: request canceled
Qu'est-ce qui cause ça? (Je me souviens d'avoir exécuté des scripts dans debian:jessie
- basé images de la même manière, alors peut-être est-il spécifique à Alpine)?
Alpine est livré avec /bin/sh
comme shell par défaut au lieu de /bin/bash
.
Afin que vous puissiez
Avoir un Shebang définissant/bin/sh comme première ligne de votre sayhello.sh, ainsi votre fichier sayhello.sh commencera par
#!/bin/sh
Installez Bash dans votre image Alpine, comme vous semblez l’attendre, avec une telle ligne dans votre fichier Docker:
RUN apk add --update bash && rm -rf /var/cache/apk/*
Cette réponse a tout à fait raison et fonctionne bien.
Il y a un autre moyen. Vous pouvez exécuter un script Bash dans un conteneur Docker basé sur Alpine.
Vous devez changer CMD comme ci-dessous:
CMD ["sh", "sayhello.sh"]
Et ça marche aussi.
N'oubliez pas d'accorder une autorisation d'exécution pour tous les scripts.
FROM Alpine
COPY sayhello.sh /sayhello.sh
RUN chmod +x /sayhello.sh
CMD ["/sayhello.sh"]
En utilisant le CMD
, Docker cherche le sayhello.sh
fichier dans PATH
, MAIS vous l'avez copié dans /
qui n'est pas dans le PATH
.
Utilisez donc un chemin absolu vers le script que vous voulez exécuter:
CMD ["/sayhello.sh"]
BTW, comme @ user2915097 a dit, veillez à ce que Alpine ne dispose pas de Bash par défaut si votre script l’utilise dans Shebang.