我有一个超级愚蠢的剧本
$ cat script.sh
cat <<EOT > entrypoint.sh
#!/bin/bash
echo "$@"
EOT
docker run -it --rm -v $(pwd)/entrypoint.sh:/root/entrypoint.sh --entrypoint /root/entrypoint.sh bash:4 Hello World
但是当我运行脚本时,出现了奇怪的错误:
$ sh script.sh
standard_init_linux.go:207: exec user process caused "no such file or directory"
为什么脚本不打印Hello world
?
答案 0 :(得分:1)
首先:
请求
docker run -it --rm bash:4 which bash
输出
/ usr / local / bin / bash
所以
#!/bin/bash
应更改为
#!/usr/local/bin/bash
还有
docker run -it --rm -v $(pwd)/entrypoint.sh:/root/entrypoint.sh --entrypoint /root/entrypoint.sh bash:4 Hello World
给你
Hello World
更新
代码
cat <<EOT > entrypoint.sh
#!/bin/bash
echo "$@"
EOT
应固定为
#!/usr/bin/env bash
cat <<EOT > entrypoint.sh
#!/usr/bin/env bash
echo "\$@"
EOT
答案 1 :(得分:1)
standard_init_linux.go:207: exec user process caused "no such file or directory"
上述错误表示以下情况之一:
您的脚本实际上不存在。对于您的卷挂载,这不太可能,但是在没有入口点的情况下运行容器也没有什么坏处,只需打开具有相同卷挂载的shell并列出文件以确保其存在。卷挂载可能在不与Docker VM共享目录的桌面版docker上失败,最终导致在容器内创建空文件夹而不是挂载文件。从另一个容器内部检查时,还请确保您对该脚本具有执行权限。
如果是脚本,则指向解释器的第一行无效。确保该命令存在于容器内。例如。高山容器通常不附带bash,而您需要使用/bin/sh
。这是我看到的最常见的问题。
如果是脚本,类似于上面的内容,请确保第一行具有linux换行符。 Windows换行符会在尝试运行的命令名称上添加\r
,这在Linux端找不到。
如果命令是二进制文件,则可以引用丢失的库。我经常看到这种“静态”编译的go二进制文件,这些二进制文件没有禁用CGO,并且在导入网络库时出现了指向libc的链接。
如果您使用json格式运行命令,则我经常会看到此错误,且包含无效的json语法。这不适用于您的用例,但可能对其他使用此问题的人有所帮助。
此列表摘自我去年在DockerCon上的一次演讲:https://sudo-bmitch.github.io/presentations/dc2018/faq-stackoverflow.html#59