도커 런
이런 명령어를 여러 개 실행하려고 합니다.
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)
하지만 이것들은 효과가 없었습니다.
도커 런 레퍼런스를 찾아봤지만 이스케이프 캐릭터에 대한 힌트를 찾지 못했습니다.
도커에서 여러 명령을 실행하려면 다음을 사용합니다./bin/bash -c
그리고 세미콜론;
docker run image_name /bin/bash -c "cd /path/to/somewhere; python a.py"
command1(cd)이 0(오류 없음) exit 상태를 반환한 경우에만 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"
도커 컨테이너 내부에서 명령어를 파이프에 넣을 수도 있습니다.bash -c "<command1> | <command2>"
예를 들어 다음과 같습니다.
docker run img /bin/bash -c "ls -1 | wc -l"
그러나 원격에서 셸을 호출하지 않고 출력이 로컬 터미널로 리디렉션됩니다.
bash -c
실행 중인 명령이 비교적 간단한 경우에 잘 작동합니다.그러나 제어 문자로 가득 찬 긴 일련의 명령을 실행하려고 하면 복잡해질 수 있습니다.
저는 외부에서 제 명령을 프로세스에 주입함으로써 이 문제를 성공적으로 해결했습니다.
cat script.sh | docker run -i <image> /bin/bash
@Eddy Hernandez의 논평에서 적절한 대답을 하기 위해 그리고 알파인은 배시가 아닌 재와 함께 나오기 때문에 매우 정확합니다.
이 질문은 이제 도커 알파인 컨테이너에서 셸을 시작하는 것과 관련이 있으며, 이는 다음을 의미합니다.sh
아니면ash
아니면/bin/sh
아니면/bin/ash/
.
OP의 질문에 근거하여:
docker run image sh -c "cd /path/to/somewhere && python a.py"
TL;DR;
$ docker run --entrypoint /bin/sh image_name -c "command1 && command2 && command3"
승인된 답변에 대한 우려 사항은 아래와 같습니다.
아무도 그것에 대해 언급하지 않았습니다.docker run image_name /bin/bash -c
진입 지점에 명령을 추가할 뿐입니다.일부 인기 있는 이미지는 이를 올바르게 처리할 수 있을 정도로 똑똑하지만 그렇지 않은 이미지도 있습니다.
다음 도커 파일을 상상해 보십시오.
FROM alpine
ENTRYPOINT ["echo"]
만약 당신이 그것을 지으려고 합니다.echo
실행 중:
$ docker run echo /bin/sh -c date
진입 지점에 명령이 추가되어 결과가 다음과 같습니다.echo "/bin/sh -c date"
.
대신 진입점을 재정의해야 합니다.
$ docker run --entrypoint /bin/sh echo -c date
결과를 컨테이너 외부의 로컬 컴퓨터에서 하나의 파일에 저장하려면 다음과 같은 작업을 수행할 수 있습니다.
RES_FILE=$(readlink -f /tmp/result.txt)
docker run --rm -v ${RES_FILE}:/result.txt img bash -c "grep root /etc/passwd > /result.txt"
명령 결과는 다음에서 확인할 수 있습니다./tmp/result.txt
당신의 로컬 머신에서.
여기 와 같은 일을 하려고 온 다른 사람들을 위해docker-compose
당신은 단지 가식을 차리면 됩니다.bash -c
여러 명령을 따옴표로 묶고 함께 결합합니다.&&
.
그래서 OPs 예제에서docker-compose run image bash -c "cd /path/to/somewhere && python a.py"
하위 셸에서 실행되는 명령어도 상관없다면 실행할 여러 명령어 주위에 일련의 외부 괄호를 붙이면 됩니다.
docker run image (cd /path/to/somewhere && python a.py)
명백하지 않은 경우, 만약a.py
항상 특정한 디렉토리에서 실행되어야 하고, 간단한 래퍼 스크립트를 만들어야 합니다.cd
스크립트를 실행합니다.
당신의Dockerfile
,교체하다
CMD [ 'python', 'a.py' ]
아니면 무엇이든지
CMD [ '/wrapper' ]
스크립트를 만듭니다.wrapper
다음과 같은 내용이 포함된 루트 디렉토리(또는 당신에게 편리한 곳)에서
#!/bin/sh
set -e
cd /path/to/somewhere
python a.py
많은 상황에서, 아마 다시 쓰는 것도 고려해보세요.a.py
포장지가 필요 없도록 말입니다.해내든지os.chdir()
필요한 위치에 저장하거나 환경에서 구성하는 디렉토리 또는 유사한 디렉토리에서 데이터 파일을 찾도록 합니다.
언급URL : https://stackoverflow.com/questions/28490874/docker-run-image-multiple-commands
'programing' 카테고리의 다른 글
빠른(낮은) 코드 쓰는 법? (0) | 2023.11.07 |
---|---|
Python, MySQL 및 SELECT 출력은 키에 대한 열 이름을 사용하여 사전에 출력합니다. (0) | 2023.11.07 |
크롬 확장 메시지 전달: 응답이 전송되지 않음 (0) | 2023.11.07 |
브라우저 뒤로가기 버튼을 사용할 때 페이지를 강제로 다시 로드하는 방법은? (0) | 2023.11.07 |
특정 URL에 대해 Spring Security 3.2 CSRF 사용 안 함 (0) | 2023.11.07 |