developer tip

셸 스크립트를 사용하여 도커 컨테이너 내에서 스크립트 실행

optionbox 2020. 11. 26. 08:11
반응형

셸 스크립트를 사용하여 도커 컨테이너 내에서 스크립트 실행


Docker 기술을 처음 사용합니다. 도커 컨테이너를 설정하기위한 셸 스크립트를 만들려고합니다. 스크립트 파일은 다음과 같습니다.

#!bin/bash

docker run -t -i -p 5902:5902 --name "mycontainer" --privileged myImage:new /bin/bash

이 스크립트 파일을 실행하면 새로 호출 된 bash에서 컨테이너가 실행됩니다.

이제 위의 셸 스크립트에서 이미 컨테이너 내에있는 스크립트 파일 (test.sh)을 실행해야합니다. (예 : cd /path/to/test.sh && ./test.sh) 방법, 제발 시나리오가 명확하지 않은 경우 자유롭게 물어보십시오.


다음을 사용하여 실행중인 컨테이너에서 명령을 실행할 수 있습니다 docker exec [OPTIONS] CONTAINER COMMAND [ARG...].

docker exec mycontainer /path/to/test.sh

그리고 bash 세션에서 실행하려면 :

docker exec -it mycontainer /bin/bash

그리고 거기에서 스크립트 등을 실행할 수 있습니다.


Docker 컨테이너가 실행 중이라고 가정하면 다음과 같이 명령을 실행할 수 있습니다.

docker exec mycontainer /bin/sh -c "cmd1;cmd2;...;cmdn"

이 질문에 대한 답변을 찾고 있었고 Dockerfile 솔루션 에서 ENTRYPOINT를 찾았 습니다.

Dockerfile

...
ENTRYPOINT /my-script.sh ; /my-script2.sh ; /bin/bash

이제 컨테이너를 시작할 때 스크립트가 실행되고 스크립트가 실행 된 후 bash 프롬프트가 표시됩니다.


Docker 이미지에 로컬 디렉토리를 마운트하고 .bashrc. 스크립트가 모든 새 셸에서 실행되기를 원하지 않는 한 스크립트가 함수로 구성되어야한다는 것을 잊지 마십시오. (이는 업데이트 공지를 참조하십시오.)

이 솔루션을 사용하여 도커 인스턴스 외부의 스크립트를 업데이트 할 수 있습니다. 이렇게하면 변경 사항이 발생하더라도 이미지를 다시 실행할 필요없이 새 셸을 엽니 다. (셸 다시 열기 제거-업데이트 알림 참조)

현재 디렉터리를 바인딩하는 방법은 다음과 같습니다.

docker run -it -v $PWD:/scripts $my_docker_build /bin/bash

이제 현재 디렉터리가 /scriptsDocker 인스턴스에 바인딩됩니다 .

(오래됨) .bashrc변경 사항 을 저장하려면 다음 명령으로 작업 이미지를 커밋하십시오.

docker commit $container_id $my_docker_build

최신 정보

모든 변경 사항에 대해 새 셸을 여는 문제를 해결하기 위해 이제 다음을 수행합니다.

dockerfile 자체에 RUN echo "/scripts/bashrc" > /root/.bashrc". 내부 zshrc에서 스크립트 디렉토리를 경로로 내 보냅니다. 이제 스크립트 디렉토리에 하나가 아닌 여러 파일이 포함됩니다. 이제 모든 변경 사항에 대해 하위 셸을 열지 않고도 모든 스크립트를 직접 호출 할 수 있습니다.

BTW 컨테이너 외부에서도 히스토리 파일을 정의 할 수 있습니다. 이렇게하면 더 이상 bash 변경을 커밋 할 필요가 없습니다.


진입 점도 살펴보십시오. 여러 CMD https://docs.docker.com/engine/reference/builder/#/entrypoint 를 사용할 수 있습니다.


여러 인스턴스에서 동일한 명령을 실행하려면 다음을 수행하십시오.

for i in c1 dm1 dm2 ds1 ds2 gtm_m gtm_sl; do docker exec -it $i /bin/bash -c "service sshd start"; done

참고 URL : https://stackoverflow.com/questions/31578446/running-a-script-inside-a-docker-container-using-shell-script

반응형