programing

실행 중인 도커 컨테이너에서 환경 변수를 설정하는 방법

stoneblock 2023. 8. 2. 08:40

실행 중인 도커 컨테이너에서 환경 변수를 설정하는 방법

얼마 전에 시작한 도커 컨테이너가 있다면 실행 중인 컨테이너에서 환경 변수를 설정하는 가장 좋은 방법은 무엇입니까?처음에 run 명령을 실행할 때 환경 변수를 설정했습니다.

$ docker run --name my-wordpress -e VIRTUAL_HOST=domain.example --link my-mysql:mysql -d spencercooley/wordpress

하지만 잠시 동안 실행되었기 때문에 다른 것을 추가하고 싶습니다.VIRTUAL_HOST환경 변수로 이동합니다.컨테이너를 삭제한 다음 원하는 환경 변수를 사용하여 다시 실행하는 것은 원하지 않습니다. 이전 볼륨을 새 컨테이너로 마이그레이션해야 하고, 새 컨테이너에는 손실하지 않으려는 테마 파일과 업로드가 포함되어 있기 때문입니다.

저는 단지 가치를 바꾸고 싶습니다.VIRTUAL_HOST환경 변수입니다.

도커는 현재 이 기능을 지원하지 않기 때문에 일반적으로 두 가지 옵션이 있습니다.

  1. 명령 실행자 역할을 하는 고유한 스크립트를 만듭니다.예:

    #!/bin/bash
    export VAR1=VAL1
    export VAR2=VAL2
    your_cmd
    
  2. 다음과 같은 방법으로 명령을 실행합니다.

    docker exec -i CONTAINER_ID /bin/bash -c "export VAR1=VAL1 && export VAR2=VAL2 && your_cmd"
    

도커는 이 기능을 제공하지 않습니다.

다음과 같은 문제가 있습니다. "기존 컨테이너에 환경 변수를 설정하는 방법은 무엇입니까? #8838"

"환경 변수 #7561 사용 허용"에서도 확인할 수 있습니다.

현재 Docker는 컨테이너가 생성된 후에는 컨테이너의 구성을 변경할 수 없으며, 새 컨테이너를 생성하는 것은 사소한 일이기 때문에 일반적으로 문제가 없습니다.

다소 좁은 사용 사례의 경우 도커 8838호에서 다음과 같은 종류의 해킹을 언급합니다.

도커 데몬을 중지하고 /var/lib/docker/containers/[container-id]/config.json(sic)에서 컨테이너 구성을 변경하기만 하면 됩니다.

합니다. 하고 매개 를 이솔션컨삭필다실로 . 볼륨을 마이그레이션하고 다음으로 매개 변수를 기억해야 합니다.run.

그러나 이를 위해서는 도커 데몬을 다시 시작해야 합니다.그리고 이슈 2658이 해결될 때까지 모든 컨테이너의 재시작이 포함됩니다.

받는 사람:

  1. 한 번에 여러 환경 변수를 설정할 수 있습니다.
  2. '-e' 옵션(인증 정보/api 토큰 삭제!)과 같이 'sh' 기록에 노출되는 것을 방지합니다.

사용할 수 있습니다.

--env-file key_value_file.txt

옵션:

docker run --env-file key_value_file.txt $INSTANCE_ID

실행 중인 컨테이너를 수정하여 환경 변수를 업데이트하는 방법은 다음과 같습니다.Linux에서 실행 중이라고 가정합니다.Docker 19.03.8로 테스트했습니다.

라이브 복원

먼저 Docker 데몬이 종료될 때 컨테이너를 실행 상태로 유지하도록 설정되어 있는지 확인합니다.를 합니다./etc/docker/daemon.json 가추를 합니다."live-restore": true최상위 키로 사용합니다.

sudo vim /etc/docker/daemon.json

내 파일은 다음과 같습니다.

{
    "default-runtime": "nvidia",
    "runtimes": {
        "nvidia": {
            "path": "nvidia-container-runtime",
            "runtimeArgs": []
        }
    },
    "live-restore": true
}

여기서 찍은.

컨테이너 ID 가져오기

파일에 쉽게 액세스할 수 있도록 편집할 컨테이너의 ID를 저장합니다.

export CONTAINER_ID=`docker inspect --format="{{.Id}}" <YOUR CONTAINER NAME>`

컨테이너 구성 편집

구성 파일을 편집하고 "Env" 섹션으로 이동한 후 키를 추가합니다.

sudo vim /var/lib/docker/containers/$CONTAINER_ID/config.v2.json

내 파일은 다음과 같습니다.

...,"Env":["TEST=1",...

중지 및 시작 도커

Docker를 다시 시작해도 작동하지 않습니다. 두 개의 별도 명령으로 Docker를 중지한 다음 시작해야 했습니다.

sudo systemctl stop docker
sudo systemctl start docker

에 때문에.live-restore당신의 컨테이너는 위에 있어야 합니다.

작동했는지 확인

docker exec <YOUR CONTAINER NAME> bash -c 'echo $TEST'

여기서는 작은 따옴표가 중요합니다.

또한 컨테이너의 가동 시간이 변경되지 않았는지 확인할 수 있습니다.

docker ps

이전 볼륨을 마이그레이션하지 않겠다고 썼습니다.그래서 제 생각엔 둘 중 하나가Dockerfile당신이 그것을 만들 때 사용했던.spencercooley/wordpress이미지가 있습니다.VOLUME했거나 s 정 되를었명에령 s 습니다지했정가로 했습니다.-v스위치를 켜다

다음과 같은 스위치를 사용하여 이전 컨테이너에서 볼륨을 가져오는 새 컨테이너를 시작할 수 있습니다.

$ docker run --name my-new-wordpress --volumes-from my-wordpress -e VIRTUAL_HOST=domain.com --link my-mysql:mysql -d spencercooley/wordpres

따라서 새 컨테이너를 사용할 수 있지만 이전 데이터는 사용하지 않습니다.터치하거나 마이그레이션할 필요도 없습니다.

잘 구워진 용기는 항상 상태 비저장입니다.즉, 프로세스는 정의된 볼륨의 파일만 추가하거나 수정해야 합니다.그것은 간단한 것으로 확인할 수 있습니다.docker diff <containerId>컨테이너가 작동한 후에.

이 경우 동일한 매개 변수(약간 수정된 매개 변수)로 용기를 다시 만들 때 위험하지 않습니다.이전 이미지가 생성된 것과 정확히 동일한 이미지에서 생성한 후 위에서 언급한 스위치로 동일한 볼륨을 다시 사용한다고 가정합니다.

새 컨테이너가 성공적으로 시작되고 모든 것이 올바르게 실행되는지 확인한 후에는 이전 워드프레스 컨테이너를 삭제할 수 있습니다.그러면 이전 볼륨이 새 컨테이너에서 참조되고 삭제되지 않습니다.

를 컨이너실경으로 service용사를 docker swarm수 있는 것은 다음과 같습니다.

docker service update --env-add <you environment variable> <service_name>

또한 다음을 사용하여 제거--env-rm

실행하십시오.docker exec -it <container id> env

실행 중인 컨테이너를 입력합니다.

sudo docker exec -it <container_name> /bin/bash

컨테이너에 액세스하는 사용자가 사용할 수 있는 모든 사용자에게 명령을 실행하고 다음 명령을 실행해야 하는 사용자 세션에 복사합니다.

printenv | grep -v "no_proxy" >> /etc/environment

용기 중지 및 시작

sudo docker stop <container_name>
sudo docker start <container_name>

도커 컨테이너 구성을 영구적으로 업데이트하는 방법은 다음과 같습니다.

  1. 컨테이너: 정지컨테너이:너:docker stop <container name>
  2. 구성 : 컨이너구편:docker run -it -v /var/lib/docker:/var/lib/docker alpine vi $(docker inspect --format='/var/lib/docker/containers/{{.Id}}/config.v2.json' <container name>)
  3. 도커 다시 시작

먼저 리눅스 박스에서와 같은 방식으로 컨테이너 내부에 env를 설정할 수 있습니다.

./var/lib/docker/containers/xxxx/config.v2.json 시작해야 .) 적용하려면 도커 서비스를 다시 시작해야 합니다.이렇게 하면 포트 매핑 등과 같은 다른 항목을 변경할 수 있습니다.

기본 컨테이너에서 일부 수정 후 도커 커밋으로 이 문제를 해결했습니다. 새 이미지에 태그를 지정하고 시작하면 됩니다.

docs.docker.com/engine/reference/commandline/commit

도커 커밋 [docker-id] [tag]

도커 커밋 b0e71de98cb9 스택 오버헤드:0.0.1

그런 다음 환경 변수 또는 파일을 전달할 수 있습니다.

도커 실행 --env AWS_ACCESS_KEY_ID --env AWS_SECRET_ACCESS_KEY --env AWS_SESSION_TOKEN --env-file env.local -p 8093:8093 스택 오버플로:0.1

빠른 작업 해킹은 다음과 같습니다.

  1. 실행 중인 컨테이너에 들어갑니다.docker exec -it <container_name> bash

  2. env 변수 설정, 컨테이너에 설치되지 않은 경우 vim 설치

apt-get install vim

vi ~/.profile에 파일끝추를 합니다.export MAPPING_FILENAME=p_07302021

source ~/.profile설정되었는지 확인합니다!echo $MAPPING_FILENAME

  1. 이제 컨테이너 외부에서 실행 중인 모든 것을 컨테이너 내부에서 실행할 수 있습니다.로그인한 현재 세션이 로그오프되면 작업이 손실될 수 있습니다.1단계를 시작하기 전에도 항상 화면을 사용할 수 있습니다.이렇게 하면 내부에서 실행 중인 컨테이너 세션을 로그오프한 경우 다시 로그인할 수 있습니다.

도커가 도커 파일로 구성된 이미지를 실행하는 것을 이해한 후, 이를 변경하는 유일한 방법은 다른 이미지를 빌드하는 것입니다. 모든 것을 중지하고 모든 것을 다시 실행합니다.

따라서 "실행 중인 도커 컨테이너에 환경 변수를 설정"하는 쉬운 방법은 도커 파일[1]을 읽는 것입니다(도커 검사 포함). 도커가 시작되는 방법 [1]을 이해합니다.가 예제 [1]에서다음같과시이로 을 볼 수 ./usr/local/bin/docker-php-entrypoint그리고 vi로 편집하고 한 줄을 추가할 수 있습니다.export myvar=myvalue 이래/usr/local/bin/docker-php-entrypointPosix 스크립트.

파일을 할 수 할 수 . 를 들어, " 도파일변수할있경우는다에트있니립예수스습커를크추호어들 [2]출을할가./usr/local/bin/mystart.sh이 파일에서 환경 변수를 설정할 수 있습니다.
를 시작해야 .

[1]

$ docker inspect 011aa33ba92b
[{
  . . .
  "ContainerConfig": {
  "Cmd": [
      "php-fpm"
   ],
  "WorkingDir": "/app",
  "Entrypoint": [
   "docker-php-entrypoint"
 ],
    . . .
}]

[2]

/usr/local/bin/mystart.sh
#!/bin/bash
export VAR1=VAL1
export VAR2=VAL2
your_cmd

[3]

docker restart dev-php (container name)

도커 내부 구성을 편집하여 해킹한 다음 도커 데몬을 다시 시작하는 것은 제 경우에 적합하지 않았습니다.

새 환경 설정으로 컨테이너를 재생성하여 한동안 사용할 수 있는 방법이 있습니다.

실행 중인 컨테이너에서 새 이미지 만들기:

docker commit my-service
a1b2c3d4e5f6032165497

도커가 새 이미지를 만들고 ID로 응답했습니다.이미지에 마운트 및 네트워크가 포함되어 있지 않습니다.

원래 컨테이너 중지 및 이름 바꾸기:

docker stop my-service
docker rename my-service my-service-original

수정된 환경에서 새 컨테이너 생성 및 시작:

docker run \
   -it --rm \
   --name my-service \
   --network=required-network \
   --mount type=bind,source=/host/path,target=/inside/path,readonly \
   --env 'MY_NEW_ENV_VAR=blablabla OLD_ENV=zzz' \
   a1b2c3d4e5f6032165497

여기서 저는 다음을 수행했습니다.

  • 1단계에서 빌드된 이미지에서 새로운 임시 컨테이너를 생성했습니다. 이 컨테이너는 터미널에서 출력을 표시하고 Ctrl+C에서 종료되며 이후 삭제됩니다.
  • 마운트 및 네트워크 구성
  • 사용자 지정 환경 구성 추가

임시 컨테이너로 작업한 후 Ctrl+C를 눌러 중지하고 제거한 다음 이전 컨테이너를 다시 반환합니다.

docker rename my-service-original my-service 
docker start my-service

실행 중인 도커 컨테이너 내 환경변수를 개발 환경으로 설정하는 방법

처럼 할 수 .export MY_VAR="value"~/.svrc 파일로 이동합니다.

지침들

  1. 실행 중인 컨테이너에 VScode 연결 사용
  2. 그런 다음 VScode를 사용하여 ~/.bashrc 파일을 엽니다.
  3. 파일 끝에 코드를 추가하여 변수 내보내기
export MY_VAR="value"
  1. 마지막으로 source 명령을 사용하여 .bashrc 실행
source ~/.bashrc

실행 중인 도커 컨테이너에 환경 변수를 설정할 수 있습니다.

docker exec -it -e "your environment Key"="your new value" <container> /bin/bash

아래 명령을 사용하여 확인

printenv

키가 제공된 새 값으로 업데이트됩니다.

참고: 도커가 다시 시작되면 이전 버전으로 돌아갑니다.

사용하다export VAR=Value

다음 음입력을 합니다.printenv터미널에서 올바르게 설정되었는지 확인합니다.

언급URL : https://stackoverflow.com/questions/27812548/how-to-set-an-environment-variable-in-a-running-docker-container