CÓ, BẠN CÓ THỂ LÀM ĐIỀU ĐÓ.
Sử dụng exec
và env
lệnh để thực hiện cảnh này.
Kiểm tra lịch thi đấu trong Docker
docker run -it --rm alpine:3.10
Chạy lệnh trong container:
exec env spring.application_name=happy-variable-name ${SHELL:-/bin/sh}
Xác minh các biến môi trường:
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=/
Sử dụng ps aux
để xác minh PID không thay đổi
PID USER TIME COMMAND
1 root 0:00 /bin/sh
12 root 0:00 ps aux
Sử dụng python
để xác minh biến môi trường
apk add python
python -c 'import os; print(os.environ["spring.application_name"])'
ĐẦU RA là happy-variable-name
.
Chuyện gì xảy ra
- Shell thực hiện cuộc gọi dựng sẵn
- Shell dựng sẵn thực hiện cuộc gọi syscall.exec tạo quá trình 'env' để thay thế shell hiện tại
- env process gọi syscall.execvp tạo tiến trình '/ bin / sh' để thay thế tiến trình env
Cách khác
Nếu bạn đang sử dụng docker, bạn có thể đặt biến trong Dockerfile
FROM busybox
ENV xx.f%^&*()$#ff=1234
Nếu bạn đang sử dụng kubernetes, bạn có thể đặt biến bằng ConfigMap
kiểm tra.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
Triển khai pod kubectl apply -f test.yaml
Xác minh kubectl logs foobar
đầu ra:
xx.ff-bar=1234
Cấu hình cho phép '-', '_' hoặc '.'
-D
tùy chọn dòng lệnh), vì vậy nó hoạt động ngay bây giờ. Rõ ràng chương trình nhìn vào cả hai bộ biến mà không cho tôi biết. Nhưng tôi vẫn tò mò về tên biến môi trường nào được phép.