web-dev-qa-db-fra.com

Comment exécuter un script Bash dans un conteneur Alpine Docker?

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)?

29
Kurt Peek

Alpine est livré avec /bin/sh comme shell par défaut au lieu de /bin/bash.

Afin que vous puissiez

  1. Avoir un Shebang définissant/bin/sh comme première ligne de votre sayhello.sh, ainsi votre fichier sayhello.sh commencera par

    #!/bin/sh
    
  2. 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/*
    
47
user2915097

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.

15
aerokite

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"]
6
debus

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.

2
zigarn