运行Docker时无法运行ruby命令

我有一个我用Ruby创build的图像。 我可以运行Ruby命令, irb并在运行时在映像中install gems

 docker run -it jikkujose/apple 

我也可以这样做来列出容器中的文件:

 docker run -it jikkujose/apple ls 

但是当我尝试运行Ruby命令时,它失败了:

 docker run -it jikkujose/apple ruby -e "puts 'Hello'" 

错误:

 Error response from daemon: Cannot start container c888aa8d2c7510a672608744a69f00c5feda4509742d54ea2896b7ebce76c16d: [8] System error: exec: "ruby": executable file not found in $PATH 

这可能是因为ruby可执行文件不在运行容器进程的用户的path中(也就是在Dockerfile中使用USER命令指定的用户)。 以下两个选项可能会帮助您解决问题。

  1. 运行容器时指定ruby二进制文件的完整path。 docker run -it jikkujose/apple /usr/bin/ruby -e "puts 'Hello'"
  2. /usr/bin添加到Dockerfile中的pathENV PATH /usr/bin:$PATH我不是100%确定这是有效的,但Dockerfile中的ENV运算符应该将此环境variables添加到容器中。 来源docker.com 。

或者,您可以在ENTRYPOINT中指定/usr/bin/ruby作为ENTRYPOINT点。 那就是: ENTRYPOINT ["/usr/bin/ruby"] 。 然后你可以运行docker run -it jikkujose/apple -e "puts 'Hello'"注意这会导致容器默认运行/ usr / bin / ruby​​,如果你想运行ls ,你需要重载这个入口点或其他命令。

编辑:

下面给出了最小可行的Dockerfile解决scheme。 让我们假设/ usr / bin不在$ PATH环境variables中,它在Ubuntu镜像中。

 FROM ubuntu:latest RUN apt-get install ruby -y ENV PATH /usr/bin:$PATH CMD ["bash"] 

运行docker run --rm -it pathtest ruby -e "puts 'Hello'"现在在terminal输出Hello

编辑2:

啊,你用Docker提交构build了镜像。 运行docker run命令时,您可以发送环境variables。 要做到这一点,只需像这样运行docker:

 docker run --rm -e "PATH=/usr/bin" -it pathtest ruby -e "puts 'Hello'" 

docker run的-e选项可以让你指定或覆盖容器内的一个环境variables。 请注意,您将不得不提供所有$ PATHpath与此方法相同。

您可能还想简单地编辑容器中的PATHvariables,然后重新提交容器,以便在存储在容器中的$ PATH环境variables中存在/ usr / bin。

它可能的PATH设置不正确,因此请尝试

docker run -it jikkujose / apple / usr / bin / ruby​​ -e“puts'Hello'”

要么

docker run -it jikkujose / apple / bin / sh -c“/ usr / bin / ruby​​ -e”puts'Hello'“