[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"
답변
이 작업은 몇 가지 방법으로 수행 할 수 있습니다.
-
-w 옵션을 사용하여 작업 디렉토리를 변경하십시오.
-w, –workdir = “”컨테이너 내부의 작업 디렉토리
https://docs.docker.com/engine/reference/commandline/run/#set-working-directory–w
-
전체 인수를 / 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
또는 ash
or /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