IT

Docker 실행을 통해 셸 펼쳐보기에 인수를 전달하는 방법

lottoking 2020. 8. 14. 08:00
반응형

Docker 실행을 통해 셸 펼쳐보기에 인수를 전달하는 방법


나는 도커 세계에 익숙하지 않습니다. 도커 컨테이너를 통해 명령 줄 인수를받을 셸 펼쳐를 호출합니다. 예 : 내 쉘 펼쳐지는 다음과 가변.

#!bin/bash
echo $1

Dockerfile은 다음과 가변합니다.

FROM ubuntu:14.04
COPY ./file.sh /
CMD /bin/bash file.sh

컨테이너를 실행하는 동안 인수를 전달하는 방법을 모르겠습니다.


같은 것을 사용하십시오 file.sh

#!bin/bash
echo $1

기존 Dockerfile을 사용하여 이미지를 빌드합니다.

docker build -t test .

인수 abc또는 xyz다른 이미지를 실행하십시오 .

docker run -ti test /file.sh abc

docker run -ti test /file.sh xyz

이 펼쳐와 함께 file.sh

#!/bin/bash
echo Your container args are: "$@"

Dockerfile

FROM ubuntu:14.04
COPY ./file.sh /
ENTRYPOINT ["/file.sh"]
CMD []

다음을 수행해야합니다.

% docker build -t test .
% docker run test hello world
Your container args are: hello world

Docker를 사용하면 적절한 종류의 정보를 전달하는 방법은 환경 변수를 사용하는 것입니다.

따라서 동일한 Dockerfile을 사용하여 펼쳐보기를

#!/bin/bash
echo $FOO

빌드 후 다음 docker 명령을 사용하십시오.

docker run -e FOO="hello world!" test

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

  1. docker run your_image arg1 arg2의 값을 CMD대체합니다 arg1 arg2. 그것은 더 많은 값을 추가하는 것이 아니라 CMD를 완전히 대체하는 것입니다. 이것이 컨테이너에서 bash 을 자주 실행 하는 이유 입니다.docker run some_image /bin/bash

  2. ENTRYPOINT 및 CMD 값이 모두 정의 된 경우 docker는 둘을 연결하고 명령을 실행하여 컨테이너를 시작합니다. file.sh이제 인수로 전달 될 추가 인수로 진입 점을 사용할 수 있습니다 file.sh.

  3. docker의 진입 점 및 명령에는 셸을 시작하는 고급 구문과 exec를 수행하는 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

이에 대한 자세한 내용은 다음과 가변합니다.


내가 가진 것은 실제로 작업을 실행하는 펼쳐보기 파일입니다. 이 스크립 파일은 복잡 할 수 있습니다. "run_container"라고합시다. 이 펼쳐는 명령 줄에서 인수를받습니다.

run_container p1 p2 p3

간단한 run_container는 다음과 달라집니다.

#!/bin/bash
echo "argc = ${#*}"
echo "argv = ${*}"

내가 원하는 것은 이것을 "도 커링"한 후 다음과 같이 도커 명령 줄의 매개 변수를 사용하여이 컨테이너를 시작할 수 있기를 바랍니다.

docker run image_name p1 p2 p3

그리고 run_container 스크립트가 p1 p2 p3을 매개 변수로 사용하여 실행되도록합니다.

이것은 내 해결책입니다.

Dockerfile :

FROM docker.io/ubuntu
ADD run_container /
ENTRYPOINT ["/bin/bash", "-c", "/run_container \"$@\"", "--"]

@build time을 실행하려면 다음을 수행하십시오.

CMD /bin/bash /file.sh arg1

@run time을 실행하려면 :

ENTRYPOINT ["/bin/bash"]
CMD ["/file.sh", "arg1"]

그런 다음 호스트 셸에서

docker build -t test .
docker run -i -t test

다른 옵션 ...

이것을 작동 시키려면

docker run -d --rm $IMG_NAME "bash:command1&&command2&&command3"

dockerfile에서

ENTRYPOINT ["/entrypoint.sh"]

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

반응형