# #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.
Источники:
- Передача секретов от Секретного менеджера
cloudbuild.yaml
: https://cloud.google.com/build/docs/securing-builds/use-secrets - Передача переменной среды из
cloudbuild.yaml
вDockerfile
: https://vsupalov.com/docker-build-pass-environment-variables/
Краткое резюме:
В вашем случае, для APP_USR
и APP_PASS
:
- Предоставьте Секретному менеджеру Секретный доступ (роли/secretmanager.secretAccessor) Роль IAM для секретной учетной записи службы облачных сборок (см. Первый источник).
- Добавьте
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'
- Передайте секреты на этапе сборки (зависит от того , как вы вызываете
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
- Используйте эти секреты в качестве стандартных переменных среды в своем
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')
на языке python3. Я забыл очень важный момент: после сборки файл 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 значение:****. но я все еще не могу ссылаться на него во время сборки или во время выполнения