Установка переменной среды, полученной в контейнере, во время выполнения в оболочке

У меня есть пользовательская точка входа, в которую экспортируется переменная среды. Значение переменной среды строится с использованием двух других переменных, предоставляемых во время выполнения.

Фрагмент из Dockerfile CMD ["bash", "/opt/softwareag/laas-api-server/entrypoint.sh"]. Фрагмент из entrypoint.sh

export URL="$SCHEME://$HOST:$PORT"
echo "URL:$URL"

Команда docker run -e HOST="localhost" -e PORT="443" mycentos печатает URL:localhost:443, как и ожидалось, но та же самая переменная, похоже, потеряла значение при выполнении следующей команды.

docker exec -ti <that-running-container-from-myimage> bash 
container-prompt> echo $URL
<empty-line>

Почему экспортированная переменная потеряла значение URL? Что здесь теряется?


person dexter2305    schedule 02.07.2020    source источник


Ответы (1)


Переменная среды не будет сохраняться на протяжении всего сеанса bash. при запуске контейнера он будет доступен только в этом сеансе точки входа, но позже он будет недоступен, если он установлен с использованием export.

docker ENV и экспорт RUN

Если вы хотите использовать их во всех сеансах, вы должны установить их в Dockerfile.

ENV SCHEME=http
ENV HOST=example.com
ENV PORT=3000

А на стороне приложения вы можете использовать их вместе, также они будут доступны для всех сеансов.

curl "${SCHEME}://${HOST}:${PORT}
#
Step 8/9 : RUN echo "${SCHEME}://${HOST}:${PORT}"
 ---> Running in afab41115019
http://example.com:3000

Теперь, если мы посмотрим на то, как вы используете, это не сработает, потому что

export URL="$SCHEME://$HOST:$PORT"
# only in this session
echo "URL:$URL"
# will be available for node process too but for this session only
node app.js

Например, загляните в этот Dockerfile

FROM node:alpine
RUN echo $'#!/bin/sh \n\ 
     export URL=example.com  \n\
     echo "${URL}" \n\
     node -e \'console.log("ENV URL value inside nodejs", process.env.URL)\' \n\
     exec "$@" \n\
     ' >> /bin/entrypoint.sh
RUN chmod +x /bin/entrypoint.sh
entrypoint ["entrypoint.sh"]

Таким образом, при первом запуске контейнера Docker вы сможете увидеть ожидаемый ответ.

docker run -it --rm myapp
example.com
ENV URL value inside nodejs example.com

Теперь мы хотим проверить более позднюю сессию.

docker run -it --rm abc  tail -f /dev/null
example.com
ENV URL value inside nodejs example.com

так что контейнер в это время работает, мы можем проверить для другого сеанса

docker exec -it myapp sh -c "node -e 'console.log(\"ENV URL value inside nodejs\", process.env.URL)'"
ENV URL value inside nodejs undefined

Поскольку у нас может быть один и тот же сценарий, но другое поведение из-за докера, поэтому переменная доступна только в этом сеансе, вы можете записать их в файл, если вы заинтересованы в дальнейшем использовании.

person Adiii    schedule 02.07.2020
comment
Есть ли стандартный способ установить переменную для всех сеансов? Значение такой переменной может быть определено только при запуске контейнера и не может быть определено во время сборки докера. - person dexter2305; 02.07.2020
comment
В dokcer нет, вы можете записать в файл или точку env, а затем прочитать его из точки env - единственный способ сохранить его постоянным. - person Adiii; 02.07.2020