Подтвердить что ты не робот

Как использовать переменную окружения Docker в массиве ENTRYPOINT?

Если я установил переменную среды, скажем ENV ADDRESSEE=world, и я хочу использовать ее в точке входа script, объединенной в фиксированную строку, например:

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

с world является значением переменной среды, как это сделать? Я попытался использовать "Hello, $ADDRESSEE", но это, похоже, не работает, так как буквально $ADDRESSEE.

4b9b3361

Ответ 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.