[docker] docker run <IMAGE> <다중 명령>

이와 같은 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 문자에 대한 힌트를 찾지 못했습니다.



답변

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"


답변

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

  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"
    

답변

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

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

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


답변

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

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로컬 컴퓨터에서 사용할 수 있습니다 .


답변

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

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


답변

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

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

OP의 질문을 바탕으로 :

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


답변

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

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

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