도커 실행을 통해 셸 스크립트에 인수를 전달하는 방법
저는 도커의 세계가 처음입니다.도커 컨테이너를 통해 명령줄 인수를 가져오는 셸 스크립트를 호출해야 합니다.예: 내 셸 스크립트는 다음과 같습니다.
#!bin/bash
echo $1
도커 파일은 다음과 같습니다.
FROM ubuntu:14.04
COPY ./file.sh /
CMD /bin/bash file.sh
컨테이너를 실행하는 동안 인수를 전달하는 방법을 잘 모르겠습니다.
이 대본을 가지고file.sh
#!/bin/bash
echo Your container args are: "$@"
그리고 이것Dockerfile
FROM ubuntu:14.04
COPY ./file.sh /
ENTRYPOINT ["/file.sh"]
다음을 수행할 수 있어야 합니다.
% docker build -t test .
% docker run test hello world
Your container args are: hello world
동일 사용file.sh
#!/bin/bash
echo $1
기존 도커 파일을 사용하여 이미지를 빌드합니다.
docker build -t test .
인수를 사용하여 이미지 실행abc또는xyz아니면 다른 것.
docker run -ti --rm test /file.sh abc
docker run -ti --rm test /file.sh xyz
여기에는 몇 가지 상호 작용하는 것이 있습니다.
docker run your_image arg1 arg2의 가치를 대체할 것입니다.CMD와 함께arg1 arg2이는 CMD를 완전히 대체한 것이지 더 많은 값을 추가하는 것은 아닙니다.이것이 당신이 자주 보는 이유입니다.docker run some_image /bin/bash컨테이너에서 bash 셸을 실행합니다.ENTRINEPOINT와 CMD 값이 모두 정의된 경우 도커는 두 값을 연결하고 연결된 명령을 실행하여 컨테이너를 시작합니다.그래서 당신이 당신의 진입점으로 정의하면
file.sh이제 인수로 전달될 추가 인수를 사용하여 컨테이너를 실행할 수 있습니다.file.sh.도커의 진입점과 명령에는 셸을 시작하는 문자열 구문과 실행을 수행하는 json 구문의 두 가지 구문이 있습니다.셸은 IO 리디렉션과 같은 작업을 처리하는 데 유용하며 여러 명령을 함께 연결합니다(예:
&&), 변수 치환 등.그러나 이러한 셸은 신호 처리(컨테이너를 중지하는 데 10초의 지연이 발생한 적이 있는 경우 이 지연이 원인인 경우가 많습니다)와 진입점 및 명령을 함께 연결하는 데 방해가 됩니다.진입점을 문자열로 정의하면 해당 항목이 실행됩니다./bin/sh -c "file.sh"그것만으로도 좋습니다.그러나 문자열로 정의된 명령이 있으면 다음과 같은 것을 볼 수 있습니다./bin/sh -c "file.sh" /bin/sh -c "arg1 arg2"당신의 컨테이너 안에서 시작되는 명령으로서, 그렇게 좋지 않습니다.이 두 옵션이 상호 작용하는 방법에 대한 자세한 내용은 여기 표를 참조하십시오.껍질
-c옵션은 단일 인수만 사용합니다.그 이후의 모든 것은 다음과 같이 통과될 것입니다.$1,$2등, 해당 단일 인수에 대한 것이지만, 인수를 명시적으로 전달하지 않는 한 내장된 셸 스크립트에는 포함되지 않습니다.예./bin/sh -c "file.sh $1 $2" "arg1" "arg2"효과는 있겠지만,/bin/sh -c "file.sh" "arg1" "arg2"그 이후로는 하지 않을 것입니다.file.sh인수 없이 호출됩니다.
이를 종합하면 공통 설계는 다음과 같습니다.
FROM ubuntu:14.04
COPY ./file.sh /
RUN chmod 755 /file.sh
# Note the json syntax on this next line is strict, double quotes, and any syntax
# error will result in a shell being used to run the line.
ENTRYPOINT ["file.sh"]
그런 다음 다음을 사용하여 이를 실행합니다.
docker run your_image arg1 arg2
이에 대한 자세한 내용은 다음 사이트를 참조하십시오.
- https://docs.docker.com/engine/reference/run/ #vmdk-default-command-or-mdk
- https://docs.docker.com/engine/reference/builder/ #exec-form-entrypoint-messages
Docker를 사용하는 경우 이러한 종류의 정보를 전달하는 적절한 방법은 환경 변수를 사용하는 것입니다.
따라서 동일한 Docker 파일을 사용하여 스크립트를 다음으로 변경합니다.
#!/bin/bash
echo $FOO
빌드 후 다음 도커 명령을 사용합니다.
docker run -e FOO="hello world!" test
제가 가지고 있는 것은 실제로 무언가를 실행하는 스크립트 파일입니다.이 스크립 파일은 상대적으로 복잡할 수 있습니다."run_container"라고 부릅니다.이 스크립트는 명령줄에서 인수를 가져옵니다.
run_container p1 p2 p3
단순 run_container는 다음과 같습니다.
#!/bin/bash
echo "argc = ${#*}"
echo "argv = ${*}"
제가 하고 싶은 것은 이것을 "도커링"한 후에 다음과 같은 도커 명령줄의 매개 변수를 사용하여 이 컨테이너를 시작할 수 있게 하는 것입니다.
docker run image_name p1 p2 p3
p1p2p3를 매개 변수로 run_message 스크립트를 실행합니다.
이것이 제 해결책입니다.
도커 파일:
FROM docker.io/ubuntu
ADD run_container /
ENTRYPOINT ["/bin/bash", "-c", "/run_container \"$@\"", "--"]
@build time을 실행하려는 경우:
CMD /bin/bash /file.sh arg1
@runtime을 실행하려는 경우:
ENTRYPOINT ["/bin/bash"]
CMD ["/file.sh", "arg1"]
그러면 호스트 셸에서.
docker build -t test .
docker run -i -t test
저는 인터랙티브 셸을 사용할 수 있도록 엔트리 포인트의 문자열 버전을 사용하고 싶었습니다.
FROM docker.io/ubuntu
...
ENTRYPOINT python -m server "$@"
를 합니다.--):
docker run -it server -- --my_server_flag
하는 방식은 다문음자버열전사것을다입의 입니다.ENTRYPOINT 을 실행합니다.-c 플그 뒤에 되었습니다. 다음 뒤에 셸로 전달된 인수--됩니다."$@"위치합니다.다음 표를 참조하십시오. https://tldp.org/LDP/abs/html/options.html
(무슨 일이 일어나고 있는지 이해하는 데 도움이 된 @jkh와 @BMitch의 답변 덕분입니다.)
다른 옵션은...
이 작업을 수행하려면
docker run -d --rm $IMG_NAME "bash:command1&&command2&&command3"
도커 종대로
ENTRYPOINT ["/entrypoint.sh"]
입구에서쉬
#!/bin/sh
entrypoint_params=$1
printf "==>[entrypoint.sh] %s\n" "entry_point_param is $entrypoint_params"
PARAM1=$(echo $entrypoint_params | cut -d':' -f1) # output is 1 must be 'bash' it will be tested
PARAM2=$(echo $entrypoint_params | cut -d':' -f2) # the real command separated by &&
printf "==>[entrypoint.sh] %s\n" "PARAM1=$PARAM1"
printf "==>[entrypoint.sh] %s\n" "PARAM2=$PARAM2"
if [ "$PARAM1" = "bash" ];
then
printf "==>[entrypoint.sh] %s\n" "about to running $PARAM2 command"
echo $PARAM2 | tr '&&' '\n' | while read cmd; do
$cmd
done
fi
언급URL : https://stackoverflow.com/questions/32727594/how-to-pass-arguments-to-shell-script-through-docker-run
'programing' 카테고리의 다른 글
| SQL Server에서 RegEx 사용 (0) | 2023.05.09 |
|---|---|
| AADSTS9002325: 코드 교환을 위한 인증 키는 교차 오리진 인증 코드를 상환하는 데 필요합니다. (0) | 2023.05.09 |
| VB의 여러 줄에 걸친 단일 문입니다.밑줄 문자가 없는 NET (0) | 2023.05.09 |
| 스레드에서 반환 값을 가져오는 방법은 무엇입니까? (0) | 2023.05.09 |
| SQL 오름차순 정렬 시 null 값이 마지막에 오도록 하는 방법 (0) | 2023.05.09 |