다음과 같은 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
때문에 일반적인 라이브러리가 없다는 것을 알 수 있습니다 .busybox
musl
glibc
일반적으로 무엇을 하든 setup.sh
Dockerfile의 지침을 따라 수행해야 합니까?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
그런 다음 저장소를 복제하고 계속하십시오.