Docker 컨테이너에서 환경 변수 가져 오기


124

Dockerfile에 선언되지 않은 도커 컨테이너에서 환경 변수를 얻는 가장 간단한 방법은 무엇입니까 ?

예를 들어, 일부 docker exec container /bin/bash세션을 통해 설정된 환경 변수 ?

할 수 docker exec container env | grep ENV_VAR있지만 값을 반환하는 것을 선호합니다.

을 사용해 보았지만 docker exec container echo "$ENV_VAR"대체가 컨테이너 외부에서 발생하는 것처럼 보이므로 컨테이너에서 env var를 가져 오지 않고 내 컴퓨터에서 env var를 가져옵니다.

감사.


env 및 grep을 사용하지 않는 이유가 있습니까?
aisbaa

가치가 필요합니다. 내가 올바르게 이해한다면 grep 호출의 출력을 구문 분석해야하며 오히려 그것을 피하고 싶습니다.
Citronen 2015

exec 세션에 설정된 변수가 기본 프로세스 또는 후속 exec 세션에 영향을 미치지 않는다고 생각 했습니까?
Paul Becotte 2015

답변:


137

echo "$ENV_VAR"컨테이너에서 변수 대체가 발생하도록 컨테이너 내부에서 실행하는 적절한 방법 은 다음과 같습니다.

docker exec <container_id> bash -c 'echo "$ENV_VAR"'

4
이 모든 답변은 일부 셸에 따라 다릅니다. 실행 파일 및 스크래치 기본 이미지로 env 변수를 가져올 수 없습니다.
Richard

docker run --rm -it CONTAINER bash -c 'echo "$MY_ENV_VAR"'
Henrik

"오류 : 컨테이너 없음 : 컨테이너"오류가 발생합니다. SSH를 통해 로그인 후 명령을 실행하고 있습니다.
kunwar nitesh

1
@kunwarnitesh : "container"를 작업하려는 컨테이너의 이름으로 바꿔야합니다.
jwodder

1
만들기 container단어 사람들이 변수의 이해 등
안와르

117

모든 환경 변수를 보려면 :

docker exec container env

하나를 얻으려면 :

docker exec container env | grep VARIABLE | cut -d'=' -f2

내 질문은 내가 그 길을 가고 싶지 않다고 말합니다. 또한, 후속 질문 : docker exec container env그리고 docker exec -it container /bin/bash다음 env다른 일을 뱉어. 왜?
Citronen 2015

아 ...이 사건을 만드는 도커 이미지를 구축하는 구체적인 방법 일 수 있습니다 ...
Citronen

2
흠, 지금은 훨씬 더 어렵습니다. 시도해보십시오 docker inspect container.
aisbaa

docker inspect container동일한 한계가있는 것 같습니다. 컨테이너를 실행 한 후 환경 변수를 생성하면 docker inspect(env 섹션에서) 호출에 나타나지 않습니다 .
Citronen 2015

나는 이것이 현재 받아 들여지는 대답보다 더 나은 대답이라고 생각합니다. bash명령으로 지원되지 않는 컨테이너가 여러 개 있습니다 ( 예 : alpine-node. 그래서 사용 exec container bash -c "echo $ENV_VAR"이 작동하지 않습니다. exec container env내 경우에 작품을 사용 합니다. 사용 exec container printenv도 작동합니다.
rahmatns

78

printenv VARIABLE대신 사용할 수 있습니다 /bin/bash -c 'echo $VARIABLE. 훨씬 간단하고 대체를 수행하지 않습니다.

docker exec container printenv VARIABLE

7
이것은 최종 답변해야한다
기 Jéy

5
또는 printenv모든 변수를 인쇄합니다.
naXa

kubernetes에서도 작동합니다 : kubectl exec pod-name printenv MY_VARIABLE.
Teebu

58

사용의 단점은 실행중인 컨테이너 docker exec가 필요 하므로 컨테이너가 실행 중인지 확실하지 않은 경우 편리 할 수 ​​있습니다.docker inspect -f

예 # 1. 지정된 컨테이너에서 공백으로 구분 된 환경 변수 목록을 출력합니다.

docker inspect -f \
   '{{range $index, $value := .Config.Env}}{{$value}} {{end}}' container_name

출력은 다음과 같습니다.

ENV_VAR1=value1 ENV_VAR2=value2 ENV_VAR3=value3

예제 # 2. 새 행과 grep필요한 항목 에 각 env var를 출력 합니다. 예를 들어 mysql 컨테이너의 설정은 다음과 같이 검색 할 수 있습니다.

docker inspect -f \
    '{{range $index, $value := .Config.Env}}{{println $value}}{{end}}' \
    container_name | grep MYSQL_

다음을 출력합니다.

MYSQL_PASSWORD=secret
MYSQL_ROOT_PASSWORD=supersecret
MYSQL_USER=demo
MYSQL_DATABASE=demodb
MYSQL_MAJOR=5.5
MYSQL_VERSION=5.5.52

예제 # 3. 위의 예제를 수정 하여 스크립트에서 직접 사용할 수 있는 bash 친화적 인 출력 을 얻습니다 .

docker inspect -f \
   '{{range $index, $value := .Config.Env}}export {{$value}}{{println}}{{end}}' \
   container_name | grep MYSQL

다음을 출력합니다.

export MYSQL_PASSWORD=secret
export MYSQL_ROOT_PASSWORD=supersecret
export MYSQL_USER=demo
export MYSQL_DATABASE=demodb
export MYSQL_MAJOR=5.5
export MYSQL_VERSION=5.5.52

더 자세히 알아 보려면 형식의 모든 세부 정보가 포함 된 Go의 텍스트 / 템플릿 패키지 문서 로 이동 하세요.


1
그게 최고의 답입니다. 나는 (컨테이너가 다운되었을 때)는 별도의 질문에 대답해야한다고 생각
Nickolay Kondratenko

이것은 나를 위해 일한 유일한 대답입니다. docker exec항상 내 컨테이너를 모른다고 말했습니다.
Good Night Nerd Pride

7

위의 답변 중 어느 것도 실행되지 않는 컨테이너에서 변수를 추출하는 방법을 보여주지 않습니다 ( echorun 않습니다 ( 와 함께 접근 방식 출력을 얻지 못함).

간단히을 run사용 printenv하면 다음과 같이됩니다.

docker run --rm <container> printenv <MY_VAR>

( 작업 docker-compose대신에도 유의하십시오 docker)


매우 간단합니다! 나는이 접근 방식에 정착했습니다.
opncow

또는 printenv모든 변수를 인쇄합니다.
naXa


0

@aisbaa의 대답은 환경 변수가 선언 된시기를 신경 쓰지 않으면 작동합니다. 환경 변수를 원하면 exec /bin/bash세션 내에서 선언 되었더라도 다음과 같이 사용하십시오.

IFS="=" read -a out <<< $(docker exec container /bin/bash -c "env | grep ENV_VAR" 2>&1)

그다지 예쁘지는 않지만 작업이 완료됩니다.

그런 다음 값을 얻으려면 다음을 사용하십시오.

echo ${out[1]}

jwodder의 답변을 참조하십시오.
Citronen 2015

0

이 명령은 호스트에서 도커 스택 프로세스의 환경을 검사합니다.

pidof   dockerd containerd containerd-shim | tr ' ' '\n' \
      | xargs -L1 -I{} -- sudo xargs -a '/proc/{}/environ' -L1 -0

0

명령을 entrypoint사용하여 실행되지 않는 컨테이너를 수정할 수 있습니다 docker run.

예제 show PATH 환경 변수 :

  1. using bashand echo:이 답변echo 은 잘못된 출력을 생성하지 않을 것이라고 주장합니다 .

    docker run --rm --entrypoint bash <container> -c 'echo "$PATH"'
  2. 사용 printenv

    docker run --rm --entrypoint printenv <container> PATH
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.