Можно ли добавить зависимые переменные среды в Google Cloud Run?

# #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.