我有一个像这样的 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
, 和busybox 中没有 shell因为它并不是真正适合人类的。
供您参考更换
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
此外,如果您以/lib
同样的方式查看,您会发现通常的库不存在,因为busybox
使用了 usemusl
而不是glibc
.
通常情况下,无论你做什么,都应该按照Dockerfile 中的指令setup.sh
来完成?RUN
PS:顺便说一下,
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"]
.它在 busybox 容器中对我有用
答案4
它应该使用 Unix 风格的行结尾而不是 Windows。我在 Windows 10 上也出现这个问题。
您应该在克隆存储库之前运行以下命令:
git config --global core.autocrlf false
然后克隆存储库并继续。