programing

도커 실행을 통해 셸 스크립트에 인수를 전달하는 방법

easyjava 2023. 5. 9. 23:14
반응형

도커 실행을 통해 셸 스크립트에 인수를 전달하는 방법

저는 도커의 세계가 처음입니다.도커 컨테이너를 통해 명령줄 인수를 가져오는 셸 스크립트를 호출해야 합니다.예: 내 셸 스크립트는 다음과 같습니다.

#!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

여기에는 몇 가지 상호 작용하는 것이 있습니다.

  1. docker run your_image arg1 arg2의 가치를 대체할 것입니다.CMD와 함께arg1 arg2이는 CMD를 완전히 대체한 것이지 더 많은 값을 추가하는 것은 아닙니다.이것이 당신이 자주 보는 이유입니다.docker run some_image /bin/bash컨테이너에서 bash 셸을 실행합니다.

  2. ENTRINEPOINT와 CMD 값이 모두 정의된 경우 도커는 두 값을 연결하고 연결된 명령을 실행하여 컨테이너를 시작합니다.그래서 당신이 당신의 진입점으로 정의하면file.sh이제 인수로 전달될 추가 인수를 사용하여 컨테이너를 실행할 수 있습니다.file.sh.

  3. 도커의 진입점과 명령에는 셸을 시작하는 문자열 구문과 실행을 수행하는 json 구문의 두 가지 구문이 있습니다.셸은 IO 리디렉션과 같은 작업을 처리하는 데 유용하며 여러 명령을 함께 연결합니다(예:&&), 변수 치환 등.그러나 이러한 셸은 신호 처리(컨테이너를 중지하는 데 10초의 지연이 발생한 적이 있는 경우 이 지연이 원인인 경우가 많습니다)와 진입점 및 명령을 함께 연결하는 데 방해가 됩니다.진입점을 문자열로 정의하면 해당 항목이 실행됩니다./bin/sh -c "file.sh"그것만으로도 좋습니다.그러나 문자열로 정의된 명령이 있으면 다음과 같은 것을 볼 수 있습니다./bin/sh -c "file.sh" /bin/sh -c "arg1 arg2"당신의 컨테이너 안에서 시작되는 명령으로서, 그렇게 좋지 않습니다.이 두 옵션이 상호 작용하는 방법에 대한 자세한 내용은 여기 표를 참조하십시오.

  4. 껍질-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

이에 대한 자세한 내용은 다음 사이트를 참조하십시오.

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

반응형