Переменные среды недоступны в модуле / контейнере при использовании envFrom и configMapRef (kustomize / kubernetes / laravel)

Я использую kustomize как отдельный двоичный файл (установленный вместе с Homebrew) и имею следующий файл base / kustomization.yaml:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
commonLabels:
  app: myservice
  app.kubernetes.io/name: myservice
  service: myservicename
  vendor: mycompany
  app.kubernetes.io/version: "0.1.0"
namePrefix: myservice-
namespace: mynamespace
commonAnnotations:
  supportMail: [email protected]
resources:
- pre-install-job.yaml
- cronjob.yaml
- service.yaml
- api.yaml
- worker.yaml
configMapGenerator:
- files:
  - env.properties
  name: configmap
secretGenerator:
- envs:
  - env.properties
  name: env-file-secret

Файл env.properties выглядит так:

APP_NAME="vendor-service-whatever"
APP_ENV="production"
APP_KEY="base64:onKQb...LtU="
APP_DEBUG="false"
APP_URL="https://myamazingsite.com"
LOG_CHANNEL="stderr"
DB_CONNECTION="mysql"
DB_HOST="mariadb-slave"
DB_DATABASE="incredibledb"

А в моей конфигурации pre-install-job.yaml я объявляю контейнер следующим образом:

containers:
    - name: "pre-install-job"
      image: "registry.myamazingdomain.com/vendor/whatever/service:latest"
      imagePullPolicy: "Always"
      args:
        - /bin/bash
        - -c
        - php artisan migrate --force -v;
      envFrom:
        - configMapRef:
            name: "configmap"

Проблема: переменные среды недоступны в пакете / контейнере. Я также попытался смонтировать конфигурационную карту как файл .env в контейнере, но безуспешно. Может, кто-нибудь укажет мне верное направление.

Результирующая ошибка:

Illuminate \ Database \ QueryException: SQLSTATE [HY000] [2002] В соединении отказано (SQL: выберите * из information_schema.tables, где table_schema = forge и table_name = migrations и table_type = 'BASE TABLE')

Потому что используются значения по умолчанию, а не те, которые определены в переменных среды.


person René Pardon    schedule 11.12.2019    source источник


Ответы (1)


Хорошо, я снова попытался смонтировать подтверждение как файл .env в проекте. Но на этот раз я также дал определение subPath. Теперь он работает, и команда «php artisan migrate» выполняется успешно.

  volumes:
    - name: "env-volume"
      configMap:
        name: "configmap"
  containers:
    - name: "pre-install-job"
      image: "registry.myamazingdomain.com/vendor/whatever/service:latest"
      imagePullPolicy: "Always"
      args:
        - /bin/bash
        - -c
        - php artisan migrate --force -v;
      volumeMounts:
        - name: "env-volume"
          mountPath: "/var/www/html/app/.env"
          subPath: "env.properties"

Определение subPath является частью configMapGenerator:

configMapGenerator:
  - name: configmap
    files:
      - env.properties

E.g.:

$ kubectl -n mynamespace get configmap blablubb-configmap-8c4m97m94g -o yaml

apiVersion: v1
data:
  env.properties: |
    APP_NAME="vendor-service-whatever"
    APP_ENV="production"
    APP_KEY="base64:onKQb...LtU="
    APP_DEBUG="false"
person René Pardon    schedule 11.12.2019
comment
Я НАСТОЯТЕЛЬНО рекомендую переместить этот файл .env из корневого веб-сайта в какой-нибудь системный путь. - person Jeff Beagley; 27.02.2021
comment
@JeffBeagley, я не совсем понимаю, о чем вы говорите. Файл .env хранится в карте конфигурации Kubernetes и монтируется в каталог проекта Laravel: / ‹path-to-laravel› /.env. Корень документа / ‹path-to-laravel› / public - person René Pardon; 01.03.2021
comment
Хорошая сделка, из примера сложно сказать, что / var / www / html / app не является корневым каталогом документа. Это может привести к тому, что кто-то увидит это и поместит это в корень веб-приложения. - person Jeff Beagley; 01.03.2021