Corrent将参数传递给Docker入口点

时间:2019-03-15 00:00:08

标签: bash docker

我有一个超级愚蠢的剧本

$ 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

2 个答案:

答案 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