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

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

#!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 변경을 커밋 할 필요가 없습니다.


답변

실행중인 컨테이너를 원하지 않거나 갖고 있지 않은 경우 run명령을 사용 하여 스크립트를 직접 호출 할 수 있습니다 .

반복 tty -i -t인수를 제거 하고 다음을 사용하십시오.

    $ docker run ubuntu:bionic /bin/bash /path/to/script.sh

이것은 다른 스크립트에서도 작동합니다 (테스트하지 않음).

    $ docker run ubuntu:bionic /usr/bin/python /path/to/script.py


답변

진입 점도 살펴보십시오. 여러 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