无法在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, 和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

然后克隆存储库并继续。

相关内容