Не удается получить переменные среды kubectl при развертывании - PullRequest
1 голос
/ 08 октября 2019

У меня есть докер-контейнер с настройкой нескольких переменных среды. Я знаю, что в типичном случае использования React не может прочитать эти переменные, так как переменные process.env заменяются во время переноса.

Я пытаюсь обойти это без необходимости раскручивать внутренний серверс помощью плагина под названием response-env.

Основная идея заключается в создании файла .env, который можно записать в сценарий bash. Сценарий bash скопирует все переменные среды в файл .env. Плагин сгенерирует файл env.js, который затем будет использоваться приложением React во время выполнения.

Dockerfile

FROM node:9

# Install yarn
RUN npm install yarn

# Install serve.js
RUN yarn global add serve

# Create app directory
WORKDIR /usr/app

# Copy all necessary files and grant permissions.
# - yarn.lock
# - package.json
# - .env
# - docker-entrypoint.sh
COPY . /usr/app/
COPY yarn.lock /usr/app
COPY package.json /usr/app
COPY .env /usr/app
COPY docker-entrypoint.sh /usr/app/docker-entrypoint.sh
RUN chmod 777 /usr/app/docker-entrypoint.sh

# Install dependencies.
RUN printf "\n" >> /usr/app/.env
RUN echo 'REACT_APP_GCP_PROJECT_ID='$GCP_PROJECT_ID >> /usr/app/.env //READ ENVIRONMENTAL VARIABLE HERE
RUN yarn

# Build application.
RUN yarn build

# Set entrypoint of application.
ENTRYPOINT [ "/usr/app/docker-entrypoint.sh" ]

docker-entrypoint. ш

serve build

App.jsx

...

console.log(env("GCP_PROJECT_ID"));

...

Проверка консоли

'' //Empty string.

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

Вручную exec в команду echo и правильное выполнение команды * работает:

Запрос вручную:

# echo 'REACT_APP_GCP_PROJECT_ID='$GCP_PROJECT_ID
REACT_APP_GCP_PROJECT_ID=SOME_VALUE

, но

# cat .env
REACT_APP_SETUP="OK"
REACT_APP_GCP_PROJECT_ID=

Как я могу получить переменные окружения моего pod в мой файл .env до запуска React?

1 Ответ

2 голосов
/ 09 октября 2019

Похоже, что $ 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...