답변:
같은 것을 사용하십시오 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
docker run -ti test /file.sh abc
? 스크립트가 반드시 실행되어야한다고 생각 docker run -ti test sh /file.sh abc
합니다. sh 또는 / bin / 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
ENTRYPOINT ./file.sh
chmod +x file.sh
실행 플래그를 설정하는 것을 잊지 마십시오 .
["/file.sh"]
과 /file.sh
또는[/file.sh]
Docker를 사용하면 이러한 종류의 정보를 전달하는 올바른 방법은 환경 변수를 통하는 것입니다.
따라서 동일한 Dockerfile을 사용하여 스크립트를
#!/bin/bash
echo $FOO
빌드 후 다음 docker 명령을 사용하십시오.
docker run -e FOO="hello world!" test
여기에 상호 작용하는 몇 가지가 있습니다.
docker run your_image arg1 arg2
의 값을로 CMD
바꿉니다 arg1 arg2
. 그것은 더 많은 값을 추가하지 않고 CMD를 완전히 대체합니다. 그렇기 때문에 docker run some_image /bin/bash
컨테이너에서 bash 쉘을 실행하는 경우가 종종 있습니다 .
ENTRYPOINT와 CMD 값이 모두 정의되어 있으면 docker는 두 개를 연결하고 연결된 명령을 실행하여 컨테이너를 시작합니다. 따라서 진입 점을로 정의 file.sh
하면 이제 args로 전달 될 추가 arg로 컨테이너를 실행할 수 있습니다 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
이에 대한 자세한 내용은 다음과 같습니다.
["bash", "--login", "-c"]
이미지에 / etc / profile 소스를 가져 오기 위해 시작점을 설정하는 실험을 했지만 나중에 도커 실행에 전달 된 쉘 스크립트로 인수가 전달되지 않는 이유가 궁금해졌습니다. !
내가 가진 것은 실제로 물건을 실행하는 스크립트 파일입니다. 이 스크립 파일은 비교적 복잡 할 수 있습니다. "run_container"라고하겠습니다. 이 스크립트는 명령 행에서 인수를 가져옵니다.
run_container p1 p2 p3
간단한 run_container는 다음과 같습니다.
#!/bin/bash
echo "argc = ${#*}"
echo "argv = ${*}"
내가하고 싶은 것은 "dockering"후에 도커 명령 줄의 매개 변수를 사용 하여이 컨테이너를 시작할 수 있기를 원합니다.
docker run image_name p1 p2 p3
매개 변수로 p1 p2 p3을 사용하여 run_container 스크립트를 실행하십시오.
이것은 내 솔루션입니다.
도커 파일 :
FROM docker.io/ubuntu
ADD run_container /
ENTRYPOINT ["/bin/bash", "-c", "/run_container \"$@\"", "--"]
ENTRYPOINT
배열 의 세 번째 값을 "/run_container \"$@\""
공백으로 포함하는 인수는 올바르게 처리됩니다 (예 :) docker run image_name foo 'bar baz' quux
.
@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
ENTRYPOINT
내가 런타임을 원한다고 생각하는 OP에게는 좋은 대답이지만 실제로 빌드 시간 변수를 원한다면이 대답은 깨졌습니다. 사용 ARG
및 docker build --build-arg
docs.docker.com/engine/reference/builder/#arg
다른 옵션 ...
이것을 작동 시키려면
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