[서버][Docker] /bin/sh: run.sh: not found
Dockerfile에서 도커 이미지를 만들 때 run.sh 파일이 포함되게 하고 이미지 실행시에 이 run.sh파일이 실행되도록 만들었습니다.
FROM openjdk:8-jdk-alpine
RUN apk update && apk upgrade && apk add netcat-openbsd
RUN mkdir -p /usr/local/authservice
ADD @project.build.finalName@.jar /usr/local/authservice/
ADD run.sh run.sh
RUN chmod +x run.sh
CMD ./run.sh
그런데 이상하게도.. run.sh를 실행시키는 부분에서 /bin/sh: run.sh: not found 에러가 발생했습니다.
#CMD ./run.sh
그래서 원인을 찾기 위해 마지막 라인을 주석 처리하고 도커 이미지가 실행되게 했습니다. 그리고 해당 도커 콘테이너를 실행하고 접속해서 이것저것 살펴봤습니다.
root 경로에 run.sh 파일이 잘 복사되고.. 실행 권한도 잘 변경되어 있었습니다.
그럼에도 실행을 하려고 하면 run.sh를 찾지 못한다는 에러가 발생했습니다.
vi로 해당 파일을 살펴보니 각 라인의 끝마다 ^M이라는 값이 있네요.
왜 이런 값이 생긴 것인지는 모르겠습니다.
이 값을 제거하니 정상적으로 실행이 되네요.
쉘스크립트 문법에 이상이 있으면 저런 식으로 에러가 뜨는 것 같습니다.
그런데 인텔리J에서 볼 때는.. run.sh파일에 문제가 없어 보입니다.
흠.. HexViewer로 값을 보면 개행문자에 해당하는 곳에 16진수로 0D 0A의 값을 가지고 있습니다.
0D는 CR(캐리지 리턴)이고 0A는 LF(라인 피드)인데 정상적인 값입니다.
docker export container_name > container_name_fs.tar
와 같은 명령어로 컨테이너의 내용을.. 뽑아낼 수 있습니다.
그런데 이렇게 뽑아서 보면 또 파일의 내용이 정상적으로 보이네요 ㅜㅜ
도커 컨테이너가 아닌.. 임대중인 AWS 테스트 서버에 문제의 run.sh파일을 올리고 실행을 시켜봤습니다.
-bash: ./run.sh: /bin/sh^M: bad interpreter: No such file or directory
여기서는 에러 원인이 좀 더 명확하게 보이네요.
^M: bad interpreter: No such file or directory
AWS 리눅스 서버에 두 sh파일을 업로드 하고 vi에서 hex모드로 차이점을 확인해봤습니다.
헥스 모드 변경: :%!xxd
원래 모드 복구: :%!xxd -r
(askubuntu.com/a/344698/1057258)
윈도우에서는 줄 바꿈을 0D[CR(캐리지 리턴)] + 0A[LF(라인 피드)]로 사용하며
리눅스에서는 줄 바꿈을 0A[LF(라인 피드)]로 사용하여 생긴 문제였습니다.
이 차이점을 알고 있었지만 sh가 실행이 안될 줄은 몰랐네요. 흠;;
윈도우에서 sh파일을 만들 때는 조심해야겠습니다.
Notepad++에서 우측 하단에 보면 Windows (CR LF)이라는 부분이 있습니다. 이 부분을 더블클릭하면 개행형식을 바꿀 수 있습니다. Unix (LF)로 변경하고 저장해주면 문제가 해결됩니다!
댓글 영역