시스템화 된 Docker 컨테이너에서 환경 변수 상속


9

나는이 도커 용기는 systemd 실행 . 환경 변수를 그 아래의 응용 프로그램에 전달하고 싶습니다.

Docker 내에서 systemd를 시작하면 ( /sbin/init명령 행으로) Docker는 변수를 systemd에 노출 하지만 자식 서비스에는 노출하지 않습니다 . systemd.setenv=...cmdline에 추가 하면 변수가 전달됩니다. 더 깨끗한 솔루션을 찾고 있습니다.

/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내 명령을 실행하는 동안 볼 것으로 예상됩니다 .

다시 말해, 체계화 된 변수는 전달 된 자식에게 전달 된 변수를 전달할 수 있습니까?

Dockerfile은 github repository를 참조하십시오 .

답변:


9

질문에 답변하기 위해 (다른 곳에서는 답변이없는 것 같습니다)

"/ 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

PID1에 지정된 환경 인 / proc / 1 / envion을 읽지 만 널로 구분됩니다. 'tr'을 사용하여 널을 새 행으로 바꾼 다음 해당 행을 반복하여 앞에 붙인 '내보내기'로 회피하여 하위 프로세스에 표시됩니다.

노출되지 않는 환경 변수는 시스템의 또 다른 "기능"이며 버그로 간주하지 않습니다.


3
나는 '내가 환경 변수를 필요, 나는이 기능이 필요하지 않습니다'하고 싶은 말
다니엘 다이에게

2

이 설명에 따르면 시스템 사용자 인스턴스는 환경 변수를 상속하지 않습니다.

https://wiki.archlinux.org/index.php/Systemd/User#Environment_variables

"최종"서비스에 대한 EnvironmentFile을 구성하는 oneshot 시스템 서비스를 사용하는 것이 좋습니다.

/programming/25396167/how-do-i-get-etcd-values-into-my-systemd-service-on-coreos


1
또한 확인을 고려하십시오 PassEnvironment=. 도커 시스템 환경에서 도움이되었습니다.
FelikZ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.