programing

도커 런도커 런

goodsources 2023. 11. 7. 20:50
반응형

도커 런

이런 명령어를 여러 개 실행하려고 합니다.

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"

다음과 같은 몇 가지 방법으로 수행할 수 있습니다.

  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"
    

도커 컨테이너 내부에서 명령어를 파이프에 넣을 수도 있습니다.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

반응형