docker run <IMAGE> <다중 명령>


254

이와 같은 MULTIPLE 명령을 실행하려고합니다.

docker run image cd /path/to/somewhere && python a.py

그러나 이것은 다음과 같이 해석되기 때문에 "No such file or directory"오류가 발생합니다 ...

"docker run image cd /path/to/somewhere" && "python a.py"

""또는 ()와 같은 일부 ESCAPE 문자가 필요한 것 같습니다.

그래서 나는 또한 시도했다

docker run image "cd /path/to/somewhere && python a.py"
docker run image (cd /path/to/somewhere && python a.py)

그러나 이것들은 효과가 없었습니다.

Docker Run Reference를 검색 했지만 ESCAPE 문자에 대한 힌트를 찾지 못했습니다.

답변:


439

docker에서 여러 명령을 실행하려면 /bin/bash -c및 세미콜론을 사용 하십시오.;

docker run image_name /bin/bash -c "cd /path/to/somewhere; python a.py"

command1 (cd)이 0 (오류 없음) 종료 상태를 반환 한 경우에만 command2 (python)가 실행되어야하는 경우 &&대신;

docker run image_name /bin/bash -c "cd /path/to/somewhere && python a.py"

힌트 주셔서 감사합니다! 나는 단순히 도커 실행 이미지 "cd / bin; ls"를 시도하고 다음과 같은 오류 메시지를 받았습니다. [exec : "cd / bin; ls": stat cd / bin; ls : 해당 파일 또는 디렉토리 없음] [데몬의 오류 응답 : 컨테이너를 시작할 수 없음]
ai0307

1
누구나이 대답이 컨테이너에 명령을 공급하기 위해 여기 문서를 사용하는 방법에 관심이있을 수 있습니다. 여기 문서에 대한 이와 같은 다른 질문에 대한 대답은 자유롭게 확인하십시오 .
Kohányi Róbert

14
docker run alpine sh -c "ls | wc >> xxx"이것은 bash를 사용할 수 없을 때 많은 도움이됩니다.
Eddy Hernandez

1
이것은 cd반환 코드 문제 ;unix.stackexchange.com/questions/37069/&& 참조 와 동일하지 않은 경우 에는 작동 하지만 작동 하지 않습니다.
Nick Zalutskiy

1
감사합니다 @NickZalutskiy, 귀하의 코멘트로 업데이트 된 답변
anhlc

31

이 작업은 몇 가지 방법으로 수행 할 수 있습니다.

  1. -w 옵션을 사용하여 작업 디렉토리를 변경하십시오.

    -w, --workdir = ""컨테이너 내부의 작업 디렉토리

    https://docs.docker.com/engine/reference/commandline/run/#set-working-directory--w

  2. 전체 인수를 / bin / bash에 전달하십시오.

    docker run image /bin/bash -c "cd /path/to/somewhere; python a.py"
    

--workdir제공된 링크에 언급이 없습니다 . 페이지가 이동 / 변경되었을 수 있습니다. docs.docker.com/engine/reference/run/#workdir 또는 docs.docker.com/engine/reference/commandline/run
marcv

10

Docker 컨테이너 내에서 명령을 파이프 할 수도 있습니다 ( bash -c "<command1> | <command2>"예 :

docker run img /bin/bash -c "ls -1 | wc -l"

그러나 원격에서 셸을 호출하지 않으면 출력이 로컬 터미널로 리디렉션됩니다.


3

컨테이너 외부의 하나의 파일에 결과를 저장하려면 로컬 시스템에서 다음과 같이 할 수 있습니다.

RES_FILE=$(readlink -f /tmp/result.txt)

docker run --rm -v ${RES_FILE}:/result.txt img bash -c "cat /etc/passwd | grep root > /result.txt"

명령 결과는 /tmp/result.txt로컬 컴퓨터에서 사용할 수 있습니다 .


2

여기에 와서 같은 일을하려는 다른 사람들은 여러 명령 docker-compose을 앞에 bash -c따옴표로 묶고 묶어야합니다 &&.

OPs 예제에서 docker-compose run image bash -c "cd /path/to/somewhere && python a.py"


이것은 나를 위해 일했지만 명령이 실행 된 후 도커 프로세스가 종료됩니다
node_man

그런 도커 프로세스를 어떻게 종료합니까? ctrl C 또는 ctrl Z를 누르거나 exit를 입력하지 않으면 docker stop 명령으로 종료해야합니까?
node_man

작동 docker-compose down [service-name]하지 않거나? (그리고 걱정하지 않아도됩니다. 기꺼이 도와 드리겠습니다 :))
S ..

2

@Eddy Hernandez의 의견에서 적절한 답변을 얻으려면 알파인이 배쉬가 아닌 재로 제공되므로 매우 정확합니다.

이제이 질문 은 Docker Alpine 컨테이너에서 쉘 시작sh 또는 ashor /bin/sh또는 or 사용을 의미 /bin/ash/합니다.

OP의 질문을 바탕으로 :

docker run image sh -c "cd /path/to/somewhere && python a.py"


1

bash -c실행중인 명령이 비교적 단순하면 잘 작동합니다. 그러나 제어 문자로 가득 찬 일련의 긴 명령을 실행하려고하면 복잡해질 수 있습니다.

명령을 외부에서 프로세스로 파이프하여이 문제를 성공적으로 해결했습니다.

cat script.sh | docker run -i <image> /bin/bash

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.