Tengo un script de shell de punto de entrada que acepta argumentos -a -b .
Tengo un archivo docker-compose.yml en funcionamiento donde anulo el punto de entrada de tomcat con la instrucción:
entrypoint: /usr/local/tomcat/entrypoint.sh -a param1 -b param2¿Qué es la alternativa de ejecución de Docker ?
docker run --entrypoint "/usr/local/tomcat/entrypoint.sh -a param1 -b param2" tomcat:jre8No funciona
Yo obtengo:
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".Para tu información:
docker run --entrypoint "/usr/local/tomcat/entrypoint.sh" tomcat:jre8funciona desde el punto de vista de Docker, pero obviamente el script falla
Es por las comillas que está usando alrededor de su comando.
Cuando ejecuta docker run --entrypoint "/usr/local/tomcat/entrypoint.sh -a param1 -b param2" tomcat:jre8 Docker trata todo lo que está dentro de esas comillas como un solo archivo de script.
Como se puede ver en el error:
stat /usr/local/tomcat/entrypoint.sh -a param1 -b param2: no such file or directory\"\n". Está tratando de realizar una stat en el archivo antes de ejecutarlo, por lo que sabe si existe.
Coloque los argumentos en su punto de entrada al final de su comando docker así:
docker run --entrypoint <entrypoint.sh> <image:tag> <arg1> <arg2> <arg3>Su comando se convierte en:
docker run --entrypoint /usr/local/tomcat/entrypoint.sh tomcat:jre8 -a param1 -b param2Eche un vistazo a los fragmentos de código en la documentación oficial:
El PUNTO DE ENTRADA de una imagen es similar a un COMANDO porque especifica qué ejecutable ejecutar cuando se inicia el contenedor
https://docs.docker.com/engine/reference/run/#/entrypoint-default-command-to-execute-at-runtime
Creo que esto también vale la pena señalar:
docker run , su --entrypoint debería ser lo primero. No sé cuál de mis argumentos fue el problema, pero poner --entrypoint "/bin/bash" al final no impidió la ejecución de ENTRYPOINT desde Dockerfile. Mis argumentos incluían:
NB: respondiendo a esta vieja pregunta porque la respuesta propuesta no me satisface, ya que en parte está equivocada.
Respuesta corta: no hay forma de anular el punto de entrada con múltiples argumentos, pero puede moverlos al comando (parte después del nombre de la imagen) que funcionará
Respuesta más detallada:
Después de algunas pruebas y de leer los documentos, es obvio que no hay forma de imitar el comportamiento del punto de entrada de dockerfile o docker-compose con docker run.
Las respuestas propuestas anulan el punto de entrada a un solo binario (es decir, sin argumentos) y colocan los argumentos originales en el COMANDO.
A menudo eso funciona, pero realmente hay una diferencia conceptual que puede revelar usando la docker inspect .
En Docker, ENTRYPOINT es el binario + los argumentos predeterminados que se iniciarán al inicio y que el usuario no debe cambiar en el uso normal. COMMAND son los argumentos o parámetros restantes que desea que el usuario cambie (por ejemplo, el nombre de host objetivo de ping). Por lo tanto, son conceptualmente diferentes.
Diciendo que en muchos casos esto no es una cuestión de mover argumentos desde el punto de entrada al comando para un contenedor de una sola vez, el comando resultante se verá igual.