# #kubernetes #google-cloud-platform #environment-variables #google-cloud-run #knative
Вопрос:
Я хотел бы указать зависимые переменные среды в службе облачного запуска.
Если бы переменные среды были определены в .env
файле, это выглядело бы так
DATABASE_NAME=my-database
DATABASE_USER=root
DATABASE_PASSWORD=P4SSw0rd!
DATABASE_PORT=5432
DATABASE_HOST="/socket/my-database-socket"
DATABASE_URL="user=${DATABASE_USER} password=${DATABASE_PASSWORD} dbname=${DATABASE_NAME} host=${DATABASE_HOST}"
В этом примере DATABASE_URL
зависит от всех остальных переменных среды.
Чтобы развернуть службу, я выполняю следующую команду:
gcloud run deploy my-service
--image gcr.io/my-project/my-image:latest
--region europe-west1
--port 80
--platform managed
--allow-unauthenticated
--set-env-vars 'DATABASE_NAME=my-database'
--set-env-vars 'DATABASE_USER=root'
--set-env-vars 'DATABASE_PASSWORD=P4SSw0rd!'
--set-env-vars 'DATABASE_PORT=5432'
--set-env-vars 'DATABASE_HOST="/socket/my-database-socket"'
--set-env-vars 'DATABASE_URL="user=$(DATABASE_USER) password=$(DATABASE_PASSWORD) dbname=$(DATABASE_NAME) host=$(DATABASE_HOST)"'
Вот созданное определение сервиса YAML (некоторые значения опущены)
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: my-service
spec:
template:
metadata:
name: ...
spec:
containerConcurrency: 80
timeoutSeconds: 300
containers:
- image: ...
ports:
- name: http1
containerPort: 80
env:
- name: DATABASE_NAME
value: my-database
- name: DATABASE_USER
value: root
- name: DATABASE_PASSWORD
value: P4SSw0rd!
- name: DATABASE_HOST
value: /socket/my-database-socket
- name: DATABASE_URL
value: user=$(DATABASE_USER) password=$(DATABASE_PASSWORD) dbname=$(DATABASE_NAME) host=$(DATABASE_HOST)
Проблема в том, что когда служба запущена, переменные env DATABASE_URL
кажутся не интерполированными.
Я читал, что Kubernetes поддерживает зависимые переменные env, но я не могу понять, как запустить это в облачном режиме.
Мне интересно, поддерживается ли это в конечном итоге в Cloud Run.
Комментарии:
1. Попробуйте поместить все значения в «», его строковое значение. Например :
value: "P4SSw0rd!"
2. Я перепробовал много разных синтаксисов. Как вы можете видеть, составленные переменные среды уже заключены в двойные кавычки. Как писал Э. Андерсон, это, скорее всего, не поддерживается. Чтобы сделать то, что я хочу, мне пришлось записать всю строку как секрет и использовать ее как env var.
Ответ №1:
Вполне вероятно, что это может работать в Knative с открытым исходным кодом (который использует Kubernetes для выполнения модулей), но не в Google Cloud Run (полностью размещенном), который работает на собственном исполнительном механизме.
Комментарии:
1. Да, похоже, это вообще не поддерживается. Мне удалось сделать то, что я хотел, настроив секрет, но было бы лучше сделать это, составив env var.