2016-09-12 6 views
2

내가 직면 한 문제는 인수가있는 명령을 docker run에 전달하는 방법입니다. 문제는 docker run이 명령과 인수를 단일 문자열로 사용하지 않는다는 것입니다. 불행하게도이 작동하지 않습니다docker에 문자열로 인수가있는 명령 전달

#!/bin/bash -x 
DOCKER_COMMAND='bash -c "(cd build && make)"' 
docker run --rm -it myImage "$DOCKER_COMMAND" 

:

#!/bin/bash 
docker run --rm -it myImage bash -c "(cd build && make)" 

그러나 변수의 값으로 명령 및 인수를 고려 : 그들은 같은 docker run 개별 일류 인수로 제공해야

+ docker run --rm -it myImage 'bash -c "(cd build && make)"' 
docker: Error response from daemon: oci runtime error: exec: "bash -c \"(cd build && make)\"": stat bash -c "(cd build && make)": no such file or directory. 

약간의 변화 DOCKER_COMMAND의 인용을 제거 : docker run은 대체를 이해하지 않기 때문에 :

#!/bin/bash -x 
DOCKER_COMMAND='bash -c "(cd build && make)"' 
docker run --rm -it myImage $DOCKER_COMMAND 

결과 :이 스크립트 내부 docker run에 별개의 명령과 인수로 전달되도록

+ docker run --rm -it myImage 'bash -c "(cd build && make)"' 
build: -c: line 0: unexpected EOF while looking for matching `"' 
build: -c: line 1: syntax error: unexpected end of file 

이 어떻게 변수에서 문자열을 확장 할 수 있습니다? 인 docker run 명령의 구문과

+0

질문을 최소한으로 줄여야한다고 생각합니다. (예를 들어, 도커가 관련된 것이 중요한 이유) 내게는 다음과 같이 들립니다. "환경 변수를 사용하여 스크립트에 매개 변수를 구문 분석하려면 어떻게해야합니까?" –

+0

@MichaWiedenmann은 귀하의 의견을 보내 주셔서 감사합니다. 실제로 Docker가 인수를 수락하는 방법과 환경 변수에서이를 추출하는 방법에 대한 것입니다. 대부분의 명령은 따옴표로 묶은 문자열로 작성할 수 있기 때문에 정상적으로 오지는 않지만 docker는 별도의 인수가 필요합니다 어떤 배경을 추가하겠습니다. – meowsqueak

+0

@MichaWiedenmann ok, 상당히 간단하게했습니다. – meowsqueak

답변

2

시작 :

DOCKER_COMMAND='bash -c "(cd build && make)"' 
docker run --rm -it myImage "$DOCKER_COMMAND" 

당신은 COMMAND$DOCKER_COMMAND 변수의 전체를 전달하는 :

docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...] 

이것은 당신이 실행하는 경우 의미한다. Docker에게 bash -c "(cd build && make)"과 일치하는 파일을 찾도록 요청하고 있으므로 실패하지 않는 것은 놀라운 일이 아닙니다. "도커 실행은 대체를 이해하지 못합니다"와는 아무런 관련이 없습니다. 이는 쉘이 명령 행을 실행하기 전에 구문 분석하는 방식과 관련이 있습니다. ,

docker 
run 
--rm 
-it 
myImage 
bash 
-c 
"(cd 
build 
&& 
make)" 

을 그리고 그 일을하지 않을 것 :

당신이 $DOCKER_COMMAND 주위에 따옴표를 제거

, 당신은 (내가 별도의 줄에 각 인수를두고있어 그것을 분명하게하는) 이런 식으로 호출 결국 배쉬는 unexpected EOF while looking for matching "에 대한 분명한 이유를 확인해야 스크립트 "(cd을 실행하려고 할 것입니다 때문에 ' error. Bash's -c` 옵션은 하나의 인자를 필요하지만 방식 때문에 쉘 확장이 4

을 얻고 작동 다음과 같이 할 수 있습니다.

DOCKER_COMMAND='cd build && make' 
docker run --rm -it myImage bash -c "$DOCKER_COMMAND" 

(그들은 아무것도 당신이 그들을 사용하는 방법을하지 않기 때문에 나는 당신의 명령을 주위에 괄호를 제거했습니다.)

이 방법, 당신은 bash의 명령으로 docker run를 호출하고, bash의 -c 옵션에 단일 인수 ($DOCKER_COMMAND 변수의 내용)를 제공하고 있습니다.

+0

이 두 형식의 차이점을 이해하는 데 도움이되므로 특히 설명해 주셔서 감사합니다. 문자열을 전달하는 제안을 채택했습니다. 'bash -c'는 제 응용 프로그램에 잘 맞습니다. – meowsqueak