![systemd Docker 컨테이너의 환경 변수 상속](https://linux55.com/image/40619/systemd%20Docker%20%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88%EC%9D%98%20%ED%99%98%EA%B2%BD%20%EB%B3%80%EC%88%98%20%EC%83%81%EC%86%8D.png)
나는systemd를 실행하는 Docker 컨테이너. 아래 애플리케이션에 환경 변수를 전달하고 싶습니다.
Docker에서 systemd를 시작하면( /sbin/init
명령줄로) Docker는 변수를 systemd에 노출하지만어린이 서비스에 연락하지 마세요. systemd.setenv=...
명령줄에 추가하면 변수가 전달됩니다. 더 깨끗한 솔루션을 찾고 있습니다.
/sbin/init
실행된 애플리케이션에 전달된 환경 변수를 노출하는 방법은 무엇입니까 ?
% docker run -v /sys/fs/cgroup:/sys/fs/cgroup:ro --privileged -ti \
-e VAR1=1 motiejus/systemd_fedora20 \
init systemd.setenv=VAR2=2
...
Welcome to Fedora 20 (Heisenbug)!
...
[ OK ] Reached target Multi-User System.
[root@740690365eb0 ~]# env | grep VAR
VAR2=2
VAR1=1
명령을 실행할 때 그것을 보고 싶습니다 .
즉, systemd는 전달된 변수를 시작하는 하위 프로세스에 전달할 수 있습니까?
Dockerfile은 다음을 참조하세요.github 저장소.
답변1
질문에 답하십시오(다른 곳에서는 답변이 없는 것 같습니다).
"/sbin/init에 전달된 환경 변수를 해당 환경 변수에 의해 시작된 응용 프로그램에 노출하려면 어떻게 해야 합니까?"
약간 짜증나는 bash와 Linux /proc 파일 시스템의 매우 유용한 기능이 필요합니다.
# Import our environment variables from systemd
for e in $(tr "\000" "\n" < /proc/1/environ); do
eval "export $e"
done
주어진 PID 1에 대한 환경이지만 null로 구분된 /proc/1/envion을 읽습니다. "tr"을 사용하여 null 값을 새 행으로 바꾼 다음 행을 반복하고 자식 프로세스가 볼 수 있도록 앞에 "내보내기"를 추가하여 평가합니다.
환경 변수를 노출하지 않는 것은 systemd의 또 다른 "기능"이며 버그로 간주하지 않습니다.
답변2
이 설명에 따르면 systemd 사용자 인스턴스는 환경 변수를 상속하지 않습니다.
https://wiki.archlinux.org/index.php/Systemd/User#Environment_variables
"최종" 서비스에 대한 환경 파일을 구성하려면 oneshot systemd 서비스를 사용하는 것이 좋습니다.