Как использовать переменную окружения Docker в массиве ENTRYPOINT?
Если я установил переменную среды, скажем ENV ADDRESSEE=world
, и я хочу использовать ее в точке входа script, объединенной в фиксированную строку, например:
ENTRYPOINT ["./greeting", "--message", "Hello, world!"]
с world
является значением переменной среды, как это сделать? Я попытался использовать "Hello, $ADDRESSEE"
, но это, похоже, не работает, так как буквально $ADDRESSEE
.
Ответы
Ответ 1
Вы используете exec форму ENTRYPOINT. В отличие от формы оболочки, форма exec не вызывает командную оболочку. Это означает, что обычная обработка оболочки не происходит. Например, ENTRYPOINT [ "echo", "$HOME" ]
не будет выполнять подстановку переменных в $ HOME. Если вы хотите обработать оболочку, то либо используйте форму оболочки, либо выполните оболочку напрямую, например: ENTRYPOINT [ "sh", "-c", "echo $HOME" ]
.
При использовании формы exec и непосредственного запуска оболочки, как в случае с формой оболочки, именно оболочка выполняет расширение переменной среды, а не docker (из ссылки на Dockerfile).
В вашем случае я бы использовал форму оболочки
ENTRYPOINT ./greeting --message "Hello, $ADDRESSEE\!"
Ответ 2
Я попытался решить с предложенным ответом и все еще столкнулся с некоторыми проблемами...
Это было решением моей проблемы:
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"]
Конкретно ориентируясь на вашу проблему:
RUN echo "#!/bin/bash \n./greeting --message ${ADDRESSEE}" >./entrypoint.sh
RUN chmod +x./entrypoint.sh
ENTRYPOINT ["./entrypoint.sh"]
Ответ 3
После большой боли и огромной помощи со стороны @vitr и др. Я решил попробовать
- стандартная замена bash
- форма оболочки ENTRYPOINT (отличный совет сверху)
и это сработало.
ENV LISTEN_PORT=""
ENTRYPOINT java -cp "app:app/lib/*" hello.Application --server.port=${LISTEN_PORT:-80}
например
docker run --rm -p 8080:8080 -d --env LISTEN_PORT=8080 my-image
а также
docker run --rm -p 8080:80 -d my-image
оба установите порт правильно в моем контейнере
Refs
см. https://www.cyberciti.biz/tips/bash-shell-parameter-substitution-2.html.