OUI TU PEUX LE FAIRE.
Utilisez la commande exec
et env
pour implémenter cette scène.
Appareil de test dans Docker
docker run -it --rm alpine:3.10
Exécutez la commande dans le conteneur:
exec env spring.application_name=happy-variable-name ${SHELL:-/bin/sh}
Vérifiez les variables d'environnement:
HOSTNAME=bd0bccfdc53b
SHLVL=2
HOME=/root
spring.application_name=happy-variable-name
TERM=xterm
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/
Utilisez ps aux
pour vérifier que le PID n'a pas été modifié
PID USER TIME COMMAND
1 root 0:00 /bin/sh
12 root 0:00 ps aux
Utilisez python
pour vérifier la variable d'environnement
apk add python
python -c 'import os; print(os.environ["spring.application_name"])'
OUTPUT est happy-variable-name
.
Qu'est-ce qui se passe?
- Exécuteur intégré d'appel Shell
- Le shell intégré exécute l'appel syscall.exec crée le processus 'env' pour remplacer le shell actuel
- env processus appel syscall.execvp create process '/ bin / sh' pour remplacer le processus env
Autrement
Si vous utilisez docker, vous pouvez définir une variable dans Dockerfile
FROM busybox
ENV xx.f%^&*()$#ff=1234
- Configuration de Kubernetes
Si vous utilisez kubernetes, vous pouvez définir la variable par ConfigMap
test.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: foo-config
data:
"xx.ff-bar": "1234"
---
apiVersion: v1
kind: Pod
metadata:
name: foobar
spec:
containers:
- name: test-container
image: k8s.gcr.io/busybox
command: [ "/bin/sh", "-c", "env" ]
envFrom:
- configMapRef:
name: foo-config
restartPolicy: Never
Déployer le pod kubectl apply -f test.yaml
Vérifiez la kubectl logs foobar
sortie:
xx.ff-bar=1234
ConfigMap autorise '-', '_' ou '.'
-D
option de ligne de commande), donc cela fonctionne maintenant. Évidemment, le programme regarde dans les deux ensembles de variables sans me le dire. Mais je suis toujours curieux de savoir quels noms de variables d'environnement sont autorisés.