¿Cómo uso la variable de entorno Docker en la matriz ENTRYPOINT?
Si configuro una variable de entorno, digamos ENV ADDRESSEE=world
, y quiero usarla en el script del punto de entrada concatenado en una cadena fija como:
ENTRYPOINT ["./greeting", "--message", "Hello, world!"]
Siendo world
el valor de la variable del entorno ¿cómo lo hago? Intenté usarlo "Hello, $ADDRESSEE"
pero no parece funcionar, ya que se toma $ADDRESSEE
literalmente.
Estás utilizando la forma ejecutiva de ENTRYPOINT. A diferencia del formulario de shell , el formulario exec no invoca un shell de comandos. Esto significa que no se produce el procesamiento normal del shell. Por ejemplo, ENTRYPOINT [ "echo", "$HOME" ]
no realizará sustitución de variables en $HOME. Si desea procesar el shell, utilice el formulario del shell o ejecute un shell directamente, por ejemplo: ENTRYPOINT [ "sh", "-c", "echo $HOME" ]
.
Cuando se utiliza el formulario exec y se ejecuta un Shell directamente, como en el caso del formulario Shell, es el Shell el que realiza la expansión de la variable de entorno, no Docker. (De la referencia de Dockerfile )
En tu caso, usaría la forma shell.
ENTRYPOINT ./greeting --message "Hello, $ADDRESSEE\!"
Después de mucho dolor y la gran ayuda de @vitr et al, decidí intentarlo.
- sustitución de bash estándar
- forma de concha de ENTRYPOINT (gran consejo desde arriba)
y eso funcionó.
ENV LISTEN_PORT=""
ENTRYPOINT java -cp "app:app/lib/*" hello.Application --server.port=${LISTEN_PORT:-80}
p.ej
docker run --rm -p 8080:8080 -d --env LISTEN_PORT=8080 my-image
y
docker run --rm -p 8080:80 -d my-image
ambos configuraron el puerto correctamente en mi contenedor
Árbitros
consulte https://www.cyberciti.biz/tips/bash-shell-parameter-substitution-2.html
Intenté resolverlo con la respuesta sugerida y todavía encontré algunos problemas...
Esta fue una solución a mi problema:
ARG APP_EXE="AppName.exe"
ENV _EXE=${APP_EXE}
# Build a shell script because the ENTRYPOINT command doesn't like using ENV
RUN echo "#!/bin/bash \n mono ${_EXE}" > ./entrypoint.sh
RUN chmod +x ./entrypoint.sh
# Run the generated shell script.
ENTRYPOINT ["./entrypoint.sh"]
Dirigiéndose específicamente a su problema:
RUN echo "#!/bin/bash \n ./greeting --message ${ADDRESSEE}" > ./entrypoint.sh
RUN chmod +x ./entrypoint.sh
ENTRYPOINT ["./entrypoint.sh"]
Para mí, quería almacenar el nombre del script en una variable y seguir usando el formulario ejecutivo.
Nota : asegúrese de que la variable que está intentando utilizar esté declarada como variable de entorno, ya sea desde la línea de comandos o mediante la ENV
directiva.
Inicialmente hice algo como:
ENTRYPOINT [ "${BASE_FOLDER}/scripts/entrypoint.sh" ]
Pero obviamente esto no funcionó porque estamos usando el formulario de shell y el primer programa enumerado debe ser un ejecutable en el archivo PATH
. Entonces, para solucionar este problema, esto es lo que terminé haciendo:
ENTRYPOINT [ "/bin/bash", "-c", "exec ${BASE_FOLDER}/scripts/entrypoint.sh \"${@}\"", "--" ]
Tenga en cuenta que las comillas dobles son obligatorias
Lo que esto hace es permitirnos tomar los argumentos adicionales a los que se le pasaron /bin/bash
y proporcionar esos mismos argumentos a nuestro script después de que bash haya resuelto el nombre.
hombre 7 fiesta
--
A -- señala el final de las opciones y deshabilita el procesamiento posterior de opciones. Cualquier argumento después de -- se trata como nombre de archivo y argumento. Un argumento de - es equivalente a --.
PS --
también funciona con cualquier shell compatible con POSIX. Ver guías de sintaxis de utilidades