docker에서 스크립트 파일을 실행할 수 없습니다. 해당 파일이나 디렉터리가 없습니다.

docker에서 스크립트 파일을 실행할 수 없습니다. 해당 파일이나 디렉터리가 없습니다.

다음과 같은 Dockerfile이 있습니다.

FROM alpine

COPY setup.sh /setup.sh

CMD ["/setup.sh"]

내 setup.sh는 다음과 같습니다.

#!/bin/sh

echo "hello world"

다음 명령을 실행해 보세요.

docker build .
docker run --name test 61230f9f45ad

반환된 오류는 다음과 같습니다.

standard_init_linux.go:195: exec user process caused "no such file or directory"

Windows 10 LTSB에서 Powershell을 사용하고 있는데 docker 버전이 17.12.0-ce, build c97c6d6.

답변1

어쩌면 Windows 스타일의 줄 끝이 깨졌을 수도 있습니다. Windows 줄 끝으로 저장했지만 Unix 스타일로 읽을 때 파일의 모양은 다음과 같습니다.

#!/bin/sh^M
^M
echo "hello world"^M 

shebang(#!)을 해석할 때 exec추가 캐리지 리턴 문자( CR, \r, 로 표시됨 ^M)가 표시되지만 찾을 수 없습니다 /bin/sh^M.

$ exec ./setup.sh
bash: setup.sh: /bin/sh^M: bad interpreter: No such file or directory 

Unix 스타일 줄 끝을 사용하여 파일을 저장합니다. Windows에서는 괜찮은 텍스트 편집기(Sublime Text, Notepad++, 모든 IDE 등)를 사용하여 이 작업을 수행할 수 있습니다. 또한 예상한 대로 정확하게 수행하는 dos2unix라는 간단한 명령줄 도구도 있습니다.

답변2

이것알파인 이미지 사용법busybox, 그리고비지박스에는 쉘이 없습니다왜냐하면 그것은 실제로 인간을 위한 것이 아니기 때문입니다.

참조 교체를 위해

CMD ["/setup.sh"]

통과:

CMD /bin/busybox ls -al /bin

당신은 다음을 얻습니다:

lrwxrwxrwx    1 root     root            12 Jan  9 19:37 ash -> /bin/busybox
lrwxrwxrwx    1 root     root            12 Jan  9 19:37 base64 -> /bin/busybox
lrwxrwxrwx    1 root     root            12 Jan  9 19:37 bbconfig -> /bin/busybox
-rwxr-xr-x    1 root     root        805024 Dec 12 10:42 busybox
lrwxrwxrwx    1 root     root            12 Jan  9 19:37 cat -> /bin/busybox
lrwxrwxrwx    1 root     root            12 Jan  9 19:37 chgrp -> /bin/busybox
lrwxrwxrwx    1 root     root            12 Jan  9 19:37 chmod -> /bin/busybox
lrwxrwxrwx    1 root     root            12 Jan  9 19:37 chown -> /bin/busybox
lrwxrwxrwx    1 root     root            12 Jan  9 19:37 conspy -> /bin/busybox
lrwxrwxrwx    1 root     root            12 Jan  9 19:37 cp -> /bin/busybox

[... snip ...]

lrwxrwxrwx    1 root     root            12 Jan  9 19:37 tar -> /bin/busybox
lrwxrwxrwx    1 root     root            12 Jan  9 19:37 touch -> /bin/busybox
lrwxrwxrwx    1 root     root            12 Jan  9 19:37 true -> /bin/busybox
lrwxrwxrwx    1 root     root            12 Jan  9 19:37 umount -> /bin/busybox
lrwxrwxrwx    1 root     root            12 Jan  9 19:37 uname -> /bin/busybox
lrwxrwxrwx    1 root     root            12 Jan  9 19:37 usleep -> /bin/busybox
lrwxrwxrwx    1 root     root            12 Jan  9 19:37 watch -> /bin/busybox
lrwxrwxrwx    1 root     root            12 Jan  9 19:37 zcat -> /bin/busybox

게다가 같은 방식으로 보면 . 대신 use 를 사용하기 /lib때문에 일반적인 라이브러리가 없다는 것을 알 수 있습니다 .busyboxmuslglibc

일반적으로 무엇을 하든 setup.shDockerfile의 지침을 따라 수행해야 합니까?RUN

추신: 그런데,

standard_init_linux.go:195: exec user process caused "no such file or directory"

실행 파일을 찾을 수 없거나 필수 라이브러리 중 하나를 찾을 수 없다는 의미이므로 Dockerfile 디버깅이 매우 어렵습니다.

답변3

비지박스 컨테이너 대신 CMD나 Entrypoint ["/bin/sh","/setup.sh"](또는 ) 를 넣어보세요 .["/bin/ash","/setup.sh"]["/setup.sh"]

답변4

Windows 대신 Unix 스타일 줄 끝을 사용해야 합니다. Windows 10에서도 이 문제가 발생합니다.

저장소를 복제하기 전에 다음 명령을 실행해야 합니다.

git config --global core.autocrlf false

그런 다음 저장소를 복제하고 계속하십시오.

관련 정보