SI, PUOI FARLO.
Utilizzare exec
e env
comando per implementare questa scena.
Dispositivo di prova in Docker
docker run -it --rm alpine:3.10
Esegui comando nel contenitore:
exec env spring.application_name=happy-variable-name ${SHELL:-/bin/sh}
Verifica variabili d'ambiente:
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=/
Utilizzare ps aux
per verificare che il PID non sia stato modificato
PID USER TIME COMMAND
1 root 0:00 /bin/sh
12 root 0:00 ps aux
Utilizzare python
per verificare la variabile di ambiente
apk add python
python -c 'import os; print(os.environ["spring.application_name"])'
OUTPUT è happy-variable-name
.
Cosa succede?
- Shell chiama builtin exec
- La shell integrata exec chiama syscall.exec crea il processo 'env' per sostituire la shell corrente
- chiama enyscall.execvp crea processo '/ bin / sh' per sostituire il processo env
Un altro modo
Se si utilizza la finestra mobile, è possibile impostare la variabile in File Docker
FROM busybox
ENV xx.f%^&*()$#ff=1234
Se stai usando kubernetes, puoi impostare la variabile tramite 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
Distribuire pod kubectl apply -f test.yaml
Verifica kubectl logs foobar
output:
xx.ff-bar=1234
ConfigMap consente '-', '_' o '.'
-D
un'opzione da riga di comando), quindi funziona ora. Ovviamente il programma guarda in entrambi i set di variabili senza dirmelo. Ma sono ancora curioso di sapere quali nomi di variabili di ambiente sono ammessi.