Как получить доступ к переменным среды облачного запуска в файле Dockerfile

# #docker #google-cloud-platform #environment-variables #google-cloud-run

Вопрос:

Я создал контейнерное приложение на python, которое без проблем запускается локально, используя файл .env и файл docker-compose.yml, скомпилированный с помощью сборки compose.

Затем я могу использовать переменные в файле Dockerfile следующим образом.

 ARG APP_USR
ENV APP_USR ${APP_USR}

ARG APP_PASS
ENV APP_PASS ${APP__PASS}

RUN pip install https://${APP_USR}:${APP_PASS}@github.org/*****/master.zip
 

Я развертываю облачный запуск через синхронизированный репозиторий bitbucket и определил в разделе «ВЕРСИИ» > «СЕКРЕТЫ И ПЕРЕМЕННЫЕ»>(как описано здесь: https://cloud.google.com/run/docs/configuring/environment-variables)
но я не могу понять, как получить доступ к этим переменным в файле Dockerfile во время сборки.

Насколько я понимаю, мне нужно создать облачную сборку.файл yaml для определения переменных, но я не смог найти четкого примера того, как это настроить, используя переменные среды, определенные в cloud run.

Ответ №1:

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

Но я смог использовать секреты Секретного менеджера в файле Dockerfile.

Источники:

Краткое резюме:

В вашем случае, для APP_USR и APP_PASS :

  1. Предоставьте Секретному менеджеру Секретный доступ (роли/secretmanager.secretAccessor) Роль IAM для секретной учетной записи службы облачных сборок (см. Первый источник).
  2. Добавьте availableSecrets блок в конце cloudbuild.yaml файла (вне steps блока):
 availableSecrets:
  secretManager:
  - versionName: <APP_USR_SECRET_RESOURCE_ID_WITH_VERSION>
    env: 'APP_USR'
  - versionName: <APP_PASS_SECRET_RESOURCE_ID_WITH_VERSION>
    env: 'APP_PASS'
 
  1. Передайте секреты на этапе сборки (зависит от того , как вы вызываете docker build , в документации Google используется «bash», я использую Docker напрямую):
   - id: Build
    name: gcr.io/cloud-builders/docker
    args:
      - build
      - '-f=Dockerfile'
      - '.'

      # Add these two `--build-arg` params:

      - '--build-arg'
      - 'APP_USR=$APP_USR'

      - '--build-arg'
      - 'APP_PASS=$APP_PASS'

    secretEnv: ['APP_USR', 'APP_PASS'] # <=== add this line
 
  1. Используйте эти секреты в качестве стандартных переменных среды в своем Dockerfile :
 ARG APP_USR
ENV APP_USR $APP_USR

ARG APP_PASS
ENV APP_PASS $APP_PASS

RUN pip install https://$APP_USR:$APP_PASS@github.org/*****/master.zip
 

Ответ №2:

У вас есть несколько способов добиться этого.

Вы действительно можете создать свой контейнер с вашим .env в нем. Но это не очень хорошая практика, потому что ваш файл .env может содержать секрет (ключ API, пароль базы данных,…) и потому что ваш контейнер тесно связан с окружающей средой

Другое решение состоит в том, чтобы развернуть контейнер в облачном режиме (не для создания докера, он не работает в облачном режиме) и добавить переменную среды с редакцией. для этого используйте, например, --set-env-vars=KEY1=Value1 формат.

Если у вас есть секреты, вы можете сохранить их в секретном менеджере и загрузить его как env var во время выполнения или как том

Последнее решение, если вы можете указать, где ваш контейнер получит файл .env в дереве файлов (я не специалист по Python, чтобы помочь вам в этом), вы можете использовать этот трюк, который я описал в этой статье. Он идеально подходит для файла конфигурации, он изначально хранится в секретном менеджере и, следовательно, автоматически защищает ваш секрет.

Комментарии:

1. Я уже добавил свои переменные среды в редакцию через консоль, как описано в первой части первой части приведенной вами ссылки, но ссылки на эти переменные в файле Dockerfile или моем коде python не работают.

2. У вас есть другой шаг: постройте и запустите. Во время сборки вы можете передать аргумент, который можно задать в качестве ENV в файле Dockerfile. Однако определение облачного запуска env var переопределит эти значения; рассматривайте это как «значение по умолчанию, если ничего не указано». Затем во время выполнения вы можете установить env var и получить их как любые переменные среды, без разницы, заданы ли они локально, в файле Dockerfile (значения по умолчанию) или в версии для запуска в облаке. os.getenv('KEY') на языке python

3. Я забыл очень важный момент: после сборки файл dockerfile больше не существует, у вас есть только контейнер с (или без) установленным по умолчанию env var. Ваш файл dockerfile не оценивается во время выполнения.

4. Спасибо за продолжение! В настоящее время у меня установлены поля ARG и ENV, как показано выше, для ARG/ENV APP_USR и ARG/ENV APP_PASS (это единственные переменные, используемые во время сборки для установки пакета). У меня также есть некоторые другие переменные env (все переменные env как для сборки, так и для среды выполнения были добавлены в качестве редакции в консоли), на которые я ссылаюсь в коде с помощью os.getenv («КЛЮЧ»), но в настоящее время эти поля отображаются как пустые как во время сборки, так и во время выполнения.

5. Просматривая текущие версии YAML, я вижу, что переменные определены в парах «контейнеры» > «изображение» > «env — в имени». — имя: APP_USR значение: **** -имя: APP_PASS значение:****. но я все еще не могу ссылаться на него во время сборки или во время выполнения