Похоже, что $ GCP_PROJECT_ID не определен в среде сборки, и, следовательно, он не включен в команду echo при запуске во время сборки. (Я предполагаю, что это потому, что у вас есть kubectl, определяющий его).
Предполагая, что вы ожидаете, что $ GCP_PROJECT_ID не существует в среде сборки и вместо этого вы пытаетесь скопировать его во время выполнения вашего контейнера(как показано в вашем примере exec), ваша проблема в том, что цитирование строки RUN
RUN echo 'REACT_APP_GCP_PROJECT_ID='$GCP_PROJECT_ID >> /usr/app/.env
интерпретирует $ GCP_PROJECT_ID во время сборки, которая, конечно, является пустой строкой. В вашем тесте в оболочке внутри контейнера оказалось, что $ GCP_PROJECT_ID действительно существует в среде и все хорошо.
Вам нужно на самом деле заключить в кавычки переменную $ GCP_PROJECT_ID, чтобы включить ее в / usr / app /.env, вот так (вместо того, чтобы интерпретироваться как пустая строка!):
RUN echo 'REACT_APP_GCP_PROJECT_ID=$GCP_PROJECT_ID' >> /usr/app/.env
Конечно, если вам нужно, чтобы в файл .env была включена литеральная строка, представляющая собой значение $ GCP_PROJECT_ID. Ваша единственная альтернатива может заключаться в том, чтобы фактически сделать эхо в .env в начале выполнения контейнера (например, в верхней части docker-entrypoint.sh
, и удалить весь связанный код из вашего Dockerfile).
Если я ошибаюсь из-за того, что kubectl определил его при запуске процесса, альтернативное решение потребовало бы от вас, чтобы сборка Docker имела доступ к этой переменной среды. Это можно сделать с помощью аргумента --build-arg
, например:
docker build --build-arg GCP_PROJECT_ID=[correct value] .
. В этом случае вам необходимо добавить команду аргумента в Dockerfile, например:
ARG GCP_PROJECT_ID
в какой-то момент перед командой RUN.