YA KAMU BISA MELAKUKANNYA.
Gunakan exec
dan env
perintah untuk mengimplementasikan adegan ini.
Tes Jadwal di Docker
docker run -it --rm alpine:3.10
Jalankan perintah dalam wadah:
exec env spring.application_name=happy-variable-name ${SHELL:-/bin/sh}
Verifikasi variabel lingkungan:
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=/
Gunakan ps aux
untuk memverifikasi PID tidak berubah
PID USER TIME COMMAND
1 root 0:00 /bin/sh
12 root 0:00 ps aux
Gunakan python
untuk memverifikasi variabel environmentem
apk add python
python -c 'import os; print(os.environ["spring.application_name"])'
OUTPUT adalah happy-variable-name
.
Apa yang terjadi?
- Shell call builtin exec
- Shell builtin exec memanggil syscall.exec membuat proses 'env' untuk mengganti shell saat ini
- proses env panggilan syscall.execvp buat proses '/ bin / sh' untuk menggantikan proses env
Cara lain
Jika Anda menggunakan buruh pelabuhan, Anda dapat mengatur variabel di Dockerfile
FROM busybox
ENV xx.f%^&*()$#ff=1234
Jika Anda menggunakan kubernetes, Anda dapat mengatur variabel dengan 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
Sebarkan pod kubectl apply -f test.yaml
Verifikasi kubectl logs foobar
hasil:
xx.ff-bar=1234
ConfigMap mengizinkan '-', '_' atau '.'
-D
opsi baris perintah), jadi ia bekerja sekarang. Jelas program terlihat di kedua set variabel tanpa memberi tahu saya. Tapi saya masih penasaran tentang nama variabel lingkungan mana yang diperbolehkan.