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.