¿Cómo uso la variable de entorno Docker en la matriz ENTRYPOINT?

Resuelto Psycho Punch asked hace 8 años • 11 respuestas

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 worldel valor de la variable del entorno ¿cómo lo hago? Intenté usarlo "Hello, $ADDRESSEE"pero no parece funcionar, ya que se toma $ADDRESSEEliteralmente.

Psycho Punch avatar Jun 19 '16 13:06 Psycho Punch
Aceptado

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\!"
vitr avatar Jun 19 '2016 07:06 vitr

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

mlo55 avatar May 27 '2019 10:05 mlo55

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"]
Ben Kauffman avatar Apr 17 '2018 23:04 Ben Kauffman

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 ENVdirectiva.

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/bashy 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

smac89 avatar Apr 22 '2021 02:04 smac89