Docker 컨테이너의 bash 파일에서 상대 경로 사용

Docker 컨테이너의 bash 파일에서 상대 경로 사용

나는 매우 간단한 dockerfile을 가지고 있으며 사용자가 netcat을 통해 서비스를 입력할 수 있도록 포트에 서비스를 노출해야 합니다.

FROM ubuntu:16.04
RUN apt-get update
RUN apt-get install -y socat 

# Change to strict permissions
RUN chmod 770 /bin/* /usr/bin/*
RUN chmod 771 /bin/cat /bin/ls /bin/sh /usr/bin/socat
# Add user bob
RUN useradd -m -s /bin/sh bob
EXPOSE 9000


# Add dir and change to working
RUN mkdir /home/bob/monster
WORKDIR /home/bob/monster


# copy working files and change permissions
COPY /files files


CMD ["sh","/home/bob/monster/files/start.sh"]

그런 다음 다음 두 명령을 사용하여 빌드하고 실행합니다.

 $ sudo docker build -t intmonster . 
 $ sudo docker run -p 9000:9000  --rm intmonster

호스트 시스템에서 netcat을 통해 서비스에 연결하려고 시도하는 순간을 제외하고는 모두 작동하는 것 같습니다.

$ nc 0.0.0.0 9000

그러면 컨테이너가 실행 중인 터미널에서 이 인쇄가 트리거됩니다.

$ sudo docker run -p 9000:9000  --rm intmonster
2022/01/01 22:59:53 socat[9] E execvp("./monster", "./monster"): No such file or directory
2022/01/01 22:59:53 socat[8] W waitpid(): child 9 exited with status 1

"monster" 디렉터리를 찾을 수 없는 것 같습니다.

제가 보기에는 이상해 보여서 테스트를 좀 해보고 싶었습니다. 테스트하기 위해 마지막 "CMD" 줄을 제거하고 다시 빌드했습니다. 이제 -it컨테이너 내부에서 놀기 위해 다시 깃발을 들고 달리고 있습니다 .

실행하려는 sh 파일을 CD로 복사하여 실행해 봅니다.

root@e3b83ca56f0b:/home/bob/monster/files# sh start.sh 

이것은 작동하며 netcat을 통해 찾을 수 있습니다. 그런 다음 cd ..거기에서 파일을 실행 하려고 합니다 . 언뜻 보면 작동하지만 netcat을 통해 서비스에 연결하려고 하면 다음 오류가 발생합니다.

root@e3b83ca56f0b:/home/bob/monster# sh files/start.sh 
2022/01/01 23:51:15 socat[46] E execvp("./monster", "./monster"): No such file or directory
2022/01/01 23:51:15 socat[45] W waitpid(): child 46 exited with status 1

내 이론은 bash 파일이 "monster"라는 실행 파일을 실행하기 때문에 이 문제가 발생한다는 것입니다. 홈 디렉터리에서 실행하면 프로그램은 bash 파일 자체가 아닌 호출 파일의 상대 경로를 찾습니다.

기본 Firector에서 bash 파일을 호출하지만 여전히 bash 파일에서 상대 경로를 사용하는 방법은 무엇입니까?

편집하다:

"파일" 디렉토리는 다음과 같습니다:

└── files
    ├── flag.txt
    ├── monster
    └── start.sh

답변1

디렉토리에서 스크립트를 실행할 때 스크립트가 작동한다고 언급하셨습니다 /home/bob/monster/files. 이는 스크립트가 자신과 동일한 디렉터리에서 실행 파일( )을 찾는 것으로 나타나기 때문에 오류 메시지와 일치합니다 execvp("./monster", "./monster").

그러나 dockerfile에는 WORKDIR /home/bob/monster한 수준 위의 .만 있습니다. 두 번째 WORKDIR지시문을 추가하면 트릭이 수행됩니다.

COPY /files files
WORKDIR files

/home/bob/monster/files그러면 스크립트가 예상대로 작동하도록 내부로 이동하게 됩니다 .

지침 문서 WORKDIR:https://docs.docker.com/engine/reference/builder/#workdir

관련 정보