셸 스크립트를 사용하여 도커 컨테이너 내에서 스크립트 실행
도커 컨테이너를 설정하기 위한 셸 스크립트를 작성하려고 합니다.내 스크립트 파일은 다음과 같습니다.
#!bin/bash
docker run -t -i -p 5902:5902 --name "mycontainer" --privileged myImage:new /bin/bash
이 스크립트 파일을 실행하면 컨테이너가 새로 호출된 bash에서 실행됩니다.
이제 스크립트 파일(테스트)을 실행해야 합니다.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 exec mycontainer /bin/sh -c "cmd1;cmd2;...;cmdn"
이 질문에 대한 답을 검색하던 중 도커 파일 솔루션에서 엔트리 포인트를 찾았습니다.
도커 파일
...
ENTRYPOINT /my-script.sh ; /my-script2.sh ; /bin/bash
이제 컨테이너를 시작하면 스크립트가 실행되고 스크립트가 실행된 후 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
이 명령은 나에게 효과가 있었습니다.
cat local_file.sh | docker exec -i container_name bash
로컬 디렉토리를 도커 이미지에 마운트하고 스크립트를 소스로 만들 수도 있습니다..bashrc
스크립트를 모든 새 셸에서 실행하려면 스크립트가 함수로 구성되어야 한다는 것을 잊지 마십시오. (이것은 오래된 것입니다. 업데이트 공지를 참조하십시오.)
이 솔루션을 사용하여 도커 인스턴스 외부에서 스크립트를 업데이트할 수 있습니다.이렇게 하면 변경 사항이 발생해도 이미지를 다시 실행할 필요가 없고 새 셸을 엽니다. (셸을 다시 열 필요가 없습니다. 업데이트 공지 참조)
현재 디렉토리를 바인딩하는 방법은 다음과 같습니다.
docker run -it -v $PWD:/scripts $my_docker_build /bin/bash
이제 현재 디렉터리는 다음과 같습니다./scripts
당신의 도커 인스턴스의.
(이전 버전)저장 방법.bashrc
변경 내용은 다음 명령을 사용하여 작업 이미지를 커밋합니다.
docker commit $container_id $my_docker_build
갱신하다
모든 변경 사항에 대해 새 셸을 여는 문제를 해결하기 위해 다음 작업을 수행합니다.
도커 파일 자체에 추가합니다.RUN echo "/scripts/bashrc" > /root/.bashrc"
.안에서.zshrc
스크립트 디렉터리를 경로로 내보냅니다.이제 스크립트 디렉터리에 하나의 파일 대신 여러 개의 파일이 들어 있습니다.이제 변경할 때마다 하위 셸을 열지 않고 모든 스크립트를 직접 호출할 수 있습니다.
참고로 컨테이너 외부에 기록 파일을 정의할 수도 있습니다.이렇게 하면 더 이상 배시 변경을 커밋할 필요가 없습니다.
Tomio의 답변은 도움이 되지만, 이미지 내부에 스크립트가 존재할 것으로 예상합니다.컨테이너 내에서 실행/테스트할 단일 스크립트가 있는 경우(명령줄에서 또는 스크립트에서 유용하게 사용),
$ docker run ubuntu:bionic /bin/bash -c '
echo "Hello there"
echo "this could be a long script"
'
진입점도 살펴봅니다.여러 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
이것은 오래된 것이고, 저는 논평하기에 충분한 평판 포인트가 없습니다.그래도 마빈의 아이디어를 일반화하여 매개 변수를 허용하는 방법을 공유할 가치가 있다고 생각합니다.
docker exec -i mycontainer bash -s arg1 arg2 arg3 < mylocal.sh
언급URL : https://stackoverflow.com/questions/31578446/running-a-script-inside-a-docker-container-using-shell-script
'code' 카테고리의 다른 글
MongoDb를 서비스로 설치한다는 것은 무엇을 의미합니까? (0) | 2023.04.28 |
---|---|
여러 매개 변수를 ASP에 전달하려면 어떻게 해야 합니까?Net Web API GET? (0) | 2023.04.28 |
Java용 Eclipse에서 체인된 메서드 호출을 별도의 줄로 래핑 (0) | 2023.04.28 |
가치가 있다는 것을 알고 있다는 것을 의미하기 때문에 "암시적으로 포장되지 않은 옵션"을 만들어야 하는 이유는 무엇입니까? (0) | 2023.04.28 |
bash를 사용하면 표준 오류를 다른 프로세스에 파이프로 연결하려면 어떻게 해야 합니까? (0) | 2023.04.28 |