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
여기에서 상호 작용하는 몇 가지 사항이 있습니다.
docker run your_image arg1 arg2의 값을CMD로 대체합니다arg1 arg2. 그것은 더 많은 값을 추가하는 것이 아니라 CMD를 완전히 대체하는 것입니다. 이것이 컨테이너에서 bash 셸 을 자주 실행 하는 이유 입니다.docker run some_image /bin/bashENTRYPOINT 및 CMD 값이 모두 정의 된 경우 docker는 둘을 연결하고 명령을 실행하여 컨테이너를 시작합니다.
file.sh이제 인수로 전달 될 추가 인수로 진입 점을 사용할 수 있습니다file.sh.docker의 진입 점 및 명령에는 셸을 시작하는 고급 구문과 exec를 수행하는 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/#cmd-default-command-or-options
- https://docs.docker.com/engine/reference/builder/#exec-form-entrypoint-example
내가 가진 것은 실제로 작업을 실행하는 펼쳐보기 파일입니다. 이 스크립 파일은 복잡 할 수 있습니다. "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
'IT' 카테고리의 다른 글
| Ref, Var, Agent, Atom의 Clojure 차이점 (예제 포함) (0) | 2020.08.14 |
|---|---|
| Swashbuckle을 사용하여 WebAPI의 Swagger 문서에서 메서드를 생략하는 방법 (0) | 2020.08.14 |
| RegEx가없는 String.replaceAll (0) | 2020.08.14 |
| EC2에서 파일을 다운로드해야합니까? (0) | 2020.08.14 |
| 주소에서 위도와 경도를 어떻게 사용합니까? (0) | 2020.08.14 |