docker compose run echo Пустая переменная окружения из Dockerfile ENV - на выводится значение

Проблема

Как получить через docker compse run распечатку значаения переменной окружения установленной при сборки образа контейнера через env, например:

FROM node:18.17-alpine
WORKDIR /install
COPY package.json ./
COPY package-lock.json ./
RUN npm ci
ENV NODE_PATH=/install/node_modules
WORKDIR /var/www
COPY ../ .
CMD npm start

NODE_PATH - установили при сборке и теперь хотим получить значение при запуске контейнера

Команда вида (фрагмент из мейкфайла с распечаткой переменных окружения контейнера):

docker compose  $(PROJECT_SETTINGS) run -ti  frontend  echo $$USER && echo $$NODE_PATH && echo 123 

(гда frontend имя контейнера из docker-compose.yml) возвращает:

my_user
123

-- то есть для установленной в dockerfile переменной получаем пустую строку, при этом если мы зайдем в шелл контейнера:

docker compose  $(PROJECT_SETTINGS) run -i frontend 

- то там переменная обнаруживается нормально.

Решение

Гипотеза:
Пока решение не найдено, возможно в первом примере run команды иницилизируются не все переменные, в отличие от второго случая с запуском sh

Обновлено:
причина судя по всему в том, что переменные среды в данном случае просто "приезжают" из окружения хостовой системы, ее терминала, в этом можно убедиться, применив pwd в списке команд:

docker compose  $(PROJECT_SETTINGS) run -it frontend \
 sh -c  "pwd && echo $$USER && echo $$NODE_PATH && echo 123"

-- pwd выведет путь внутри контейнера (гостевая система), но переменные будут из хостовой

vedro-compota's picture

Владислав пишет:

ENV (build time and run time)

ENV variables are available both during the build and to the future running container. In the Dockerfile, they are usable as soon as you introduce them with an ENV instruction.

Unlike ARG, ENV values are accessible by containers started from the final image. ENV values can be overridden when starting a container, more on that below.

_____________
матфак вгу и остальная классика =)