web-dev-qa-db-fra.com

Docker exécute un point d’entrée de remplacement avec un script Shell qui accepte les arguments

J'ai un script shell entrypoint qui accepte les arguments - a -b.

J'ai un fichier de travail docker-compose.yml où je remplace le point d'entrée de Tomcat par l'instruction suivante:

entrypoint: /usr/local/Tomcat/entrypoint.sh -a param1 -b param2

Qu'est-ce que docker run alternative?

docker run --entrypoint "/usr/local/Tomcat/entrypoint.sh -a param1 -b param2" Tomcat:jre8

ne marche pas

Je reçois:

docker: Error response from daemon: 
invalid header field value "oci runtime error: container_linux.go:247: 
starting container process caused \"exec:
\\\"/usr/local/Tomcat/entrypoint.sh -a param1 -b param2\\\": 
stat /usr/local/Tomcat/entrypoint.sh -a param1 -b param2: 
no such file or directory\"\n".

FYI:

docker run --entrypoint "/usr/local/Tomcat/entrypoint.sh" Tomcat:jre8

fonctionne du point de vue de Docker, mais le script échoue évidemment

20
Patrik Mihalčin

C'est à cause des citations que vous utilisez autour de votre commande.

Quand vous courez docker run --entrypoint "/usr/local/Tomcat/entrypoint.sh -a param1 -b param2" Tomcat:jre8 Docker traite ce qui se trouve dans ces citations comme un fichier de script unique.

Comme vous pouvez le voir de l'erreur:

stat /usr/local/Tomcat/entrypoint.sh -a param1 -b param2: 
no such file or directory\"\n".

Il essaie d'exécuter stat sur le fichier avant de l'exécuter, afin de savoir s'il existe.

Placez les arguments à votre point d’entrée à la fin de votre commande docker comme suit:

docker run --entrypoint <entrypoint.sh> <image:tag> <arg1> <arg2> <arg3>

Votre commande devient:

docker run --entrypoint /usr/local/Tomcat/entrypoint.sh Tomcat:jre8 -a param1 -b param2 

Regardez les extraits de code dans la documentation officielle:

L'ENTRÉE D'UNE image est semblable à une COMMANDE car elle spécifie le fichier exécutable à exécuter au démarrage du conteneur.

https://docs.docker.com/engine/reference/run/#/entrypoint-default-command-to-execute-at-runtime

32
Adrian Oprea

Je pense que cela mérite également d'être noté:

Si vous avez beaucoup d'arguments à votre docker run commande, votre --entrypoint devrait venir en premier.

Je ne sais pas lequel de mes arguments était le problème, mais en mettant --entrypoint "/bin/bash" à la fin n’a pas empêché l’exécution de ENTRYPOINT à partir du fichier Docker. Mes arguments incluaient:

  • 1x --rm
  • 1x --nom
  • 1x -it
  • 3x -v
  • 6x -p
  • 4x-e
7
Bruno Bronosky