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

109

Si configuro una variable de entorno, digamos ENV ADDRESSEE=world, y quiero usarla en el script de punto de entrada concatenado en una cadena fija como:

ENTRYPOINT ["./greeting", "--message", "Hello, world!"]

con worldser el valor de la varible entorno, cómo lo hago? Intenté usarlo "Hello, $ADDRESSEE"pero eso no parece funcionar, ya que se toma $ADDRESSEEliteralmente.

Psycho Punch
fuente

Respuestas:

216

Estás usando la forma ejecutiva de ENTRYPOINT. A diferencia del formulario de shell , el formulario exec no invoca un shell de comandos. Esto significa que el procesamiento de shell normal no ocurre. Por ejemplo, ENTRYPOINT [ "echo", "$HOME" ]no realizará la sustitución de variables en $ HOME. Si desea que el proceso de shell use el formulario de cáscara o ejecutar una cáscara directamente, por ejemplo: ENTRYPOINT [ "sh", "-c", "echo $HOME" ].
Cuando se usa 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 la ventana acoplable (de la referencia de Dockerfile ).

En su caso, usaría la forma de shell

ENTRYPOINT ./greeting --message "Hello, $ADDRESSEE\!"
vitr
fuente
2
ENTRYPOINT java -jar /dockertest.jar -Djava.security.egd=file:/dev/./urandom -Dserver.port=$portmientras ENV port=123. El puerto ENV no se resuelve. ¿Alguna idea de por qué?
xetra11
1
Si bien funciona, parece crear algunos problemas nuevos, como no incluir los argumentos pasados ​​a ese punto de entrada. Por ejemplo, no puede agregar un --attitude "shouting"argumento al docker runcomando al que se debe pasar./greeting
Daniel F
5
Úselo ENTRYPOINT ./greeting --message "Hello, $ADDRESSEE\! $0 $@"si también desea pasar variables adicionales a ./greetingtravés de la docker runinvocación (o pasar el CMDdel Dockerfile)
Daniel F
3
Tenga en cuenta que la forma de shell puede hacer que las señales no se pasen al proceso ( greetingen su ejemplo). hynek.me/articles/docker-signals
jbg
¿Puedo obtener el valor de una variable de entorno en forma ejecutiva, como `[myexecutable.sh," $ variable "], puedo hacerlo mediante [" sh "," -c "," echo $ var "], pero no de esta manera
Lázaro
13

Traté de resolver 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"]

Dirigirse 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
fuente
parece que su respuesta no proporciona soluciones completas la pregunta del OP
user9405863
Supongo que no entiendo cómo no proporciona una solución a la pregunta del OP ... Actualicé con un ejemplo para resolver con la pregunta exacta en mente.
Ben Kauffman
usted mencionó que todavía se encontró con algunos problemas !!
user9405863
correcto, por eso presenté una nueva solución. ... la respuesta "aceptada" no funcionó para mí, así que hice eco en un script de shell y funcionó.
Ben Kauffman
2
Me interesaría escuchar su enfoque entonces @ReverendTim;)
Ben Kauffman
6

Después de mucho dolor y la gran ayuda de @vitr et al anteriormente, decidí intentar

  • 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

Refs

ver https://www.cyberciti.biz/tips/bash-shell-parameter-substitution-2.html

mlo55
fuente