Variables et secrets
Fonctionnalité déployée et prise en charge. Les champs et commandes décrits ici sont stables au sein de la version v1alpha1.
Un service reçoit ses réglages par variables d'environnement : une valeur écrite dans le manifeste, ou une clé d'un Secret pour tout ce qui est confidentiel. Les Secrets ne sont jamais dans le manifeste ; vous les créez à part et l'App les référence par leur nom.
Prérequis
- Une App déployée ou en cours d'écriture (Depuis docker compose).
- Pour les secrets : savoir en créer un sur votre tenant, voir Injection dans une App.
Étapes
1. Déclarer les variables
apiVersion: deploy.stackngo.io/v1alpha1
kind: App
metadata:
name: api
spec:
imagePullSecrets: [gitlab-registry] # pour tirer l'image privée
services:
api:
image: registry.gitlab.com/acme/api:1.2.0
ports: ["8080"]
env:
LOG_LEVEL: info # chaîne
WORKERS: 4 # nombre → "4"
DEBUG: false # booléen → "false"
DB_PASSWORD: { secret: db, key: password } # clé password du Secret db
envFrom: [api-env] # toutes les clés du Secret api-env
Équivalent en ligne de commande, pour une App à un service :
sng app create api --image registry.gitlab.com/acme/api:1.2.0 --port 8080 \
--env LOG_LEVEL=info --env WORKERS=4 --env DEBUG=false \
--env-secret DB_PASSWORD=db:password --env-from api-env \
--image-pull-secret gitlab-registry
2. Créer les Secrets référencés
Créez gitlab-registry (type docker-registry), db (avec une clé password) et api-env sur
votre tenant : Injection dans une App. L'ordre
n'a pas d'importance, l'App attend.
3. Appliquer et vérifier l'état
sng apply api.yml
sng app describe api
Tant qu'un Secret manque, l'état le dit :
App : api
Statut : en cours
Message : api : Secrets absents (…) : api-env
SERVICE KIND IMAGE PHASE URL DETAIL
api deployment registry.gitlab.com/acme/api:1.2.0 Progressing - SecretNotFound Secrets absents (…) : api-env
Dès que le Secret existe, le service démarre sans autre action, en quelques minutes.
Vérification
sng app describe api affiche Statut : prête. sng app logs api montre l'application
démarrée avec ses réglages.
Modifier une variable après coup
sng app patch api --env LOG_LEVEL=debug # ajoute ou remplace
sng app patch api --env-secret SMTP_PASSWORD=smtp:password
sng app patch api --unset-env DEBUG # retire
Chaque patch met à jour le manifeste et déclenche une mise à jour progressive du service.
Pour une App à plusieurs services, ajoutez --service <nom>.
Les formes de env
| Forme | Exemple | Ce que reçoit le conteneur |
|---|---|---|
| chaîne | LOG_LEVEL: info | LOG_LEVEL=info |
| nombre | WORKERS: 4 | WORKERS=4 |
| booléen | DEBUG: false | DEBUG=false |
| référence | DB_PASSWORD: { secret: db, key: password } | la valeur de la clé password du Secret db, lue au démarrage du conteneur |
null ou vide | HOME_DIR: | refusé : écrivez HOME_DIR: "" |
Règles : 100 variables au plus par service ; nom de la forme ^[A-Za-z_][A-Za-z0-9_.-]*$ ;
secret et key sont tous deux requis dans une référence. Aucune interpolation : ${VAR} est
transmis tel quel.
envFrom : un Secret entier
envFrom: [api-env] transforme chaque clé des Secrets listés (10 au plus) en variable. C'est
la traduction naturelle d'un env_file compose. En cas de doublon entre env et envFrom,
la valeur de env l'emporte (comportement standard des conteneurs).
imagePullSecrets : images privées
spec.imagePullSecretss'applique à tous les services.services.<nom>.imagePullSecretsremplace cette liste pour un service ;[]signifie « aucun » (utile pour une image publique à côté d'images privées).- Un Secret de registre absent bloque le service (
Waiting,ImagePullSecretNotFound) : rien n'est démarré tant qu'il manque, et la plateforme re-vérifie toutes les 30 secondes. Créez-le : le service démarre dans la demi-minute qui suit.
Pour aller plus loin
- La plateforme vérifie seulement l'existence des Secrets référencés ; elle n'en lit jamais le contenu.
- Un secret référencé par
envouenvFromqui n'existe pas encore est créé pour vous, en attente, sans valeur : il apparaît danssng secret list. Posez sa valeur avecsng secret setet le service démarre (Injecter un secret dans une App). - Un secret compose monté en fichier (
secrets:) n'a pas d'équivalent : passez par une variable{secret, key}. - Les noms de Secrets sont des sous-domaines DNS (minuscules, chiffres,
-,.).