bash - 将参数正确传递给 docker 入口点

标签 bash docker

我有一个 super 愚蠢的脚本

$ 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 ?

最佳答案

standard_init_linux.go:207: exec user process caused "no such file or directory"

上述错误意味着以下之一:
  • 您的脚本实际上不存在。这不太可能与您的卷挂载有关,但在没有入口点的情况下运行容器并没有什么坏处,只需打开具有相同卷挂载的 shell 并列出文件以确保它在那里。在桌面版本的 docker 上,卷挂载可能会失败,其中目录未与 docker VM 共享,并且最终会在容器内创建空文件夹,而不是挂载文件。从另一个容器内部检查时,还要确保您对脚本具有执行权限。
  • 如果是脚本,则指向解释器的第一行无效。确保该命令存在于容器内。例如。 alpine 容器通常不附带 bash,您需要使用 /bin/sh反而。这是我看到的最常见的问题。
  • 如果它是一个脚本,类似于上面,请确保您的第一行有 linux 换行符。 Windows 换行添加和额外的 \r尝试运行的命令的名称,在 linux 端找不到。
  • 如果命令是二进制文件,它可以引用缺失的库。我经常在“静态”编译的 go 二进制文件中看到这种情况,这些二进制文件没有禁用 CGO,并且在导入网络库时会出现指向 libc 的链接。
  • 如果你使用 json 格式来运行你的命令,我经常会看到这个错误,因为 json 语法无效。这不适用于您的用例,但可能有助于其他人在谷歌上搜索此问题。

  • 这个列表来自我在去年的 DockerCon 上的演讲:https://sudo-bmitch.github.io/presentations/dc2018/faq-stackoverflow.html#59

    关于bash - 将参数正确传递给 docker 入口点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55173731/

    相关文章:

    reactjs - Docker 创建 react 应用程序热重载不起作用

    node.js - NodeJS 与 Docker-compose

    php - 如何通过 docker-php-ext-install 为 php 安装扩展?

    linux - grep -o : Keep input line format

    bash - 如何在 shell 脚本中使用 tail -f ?

    linux - Bash 使用变量从脚本运行脚本

    Docker 组合端口映射

    linux - 等待特定 pid 的最佳方法

    linux - 在非常大的文件中进行快速字符串搜索

    java - 将java应用程序部署到azure容器应用程序