运行Docker时无法运行ruby命令

时间:2015-10-14 11:14:30

标签: ruby docker

我有一个用Ruby构建的图像。我可以在运行时在图像中运行Ruby命令irbinstall 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

2 个答案:

答案 0 :(得分:2)

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

  1. 在运行容器时指定ruby二进制文件的完整路径。 docker run -it jikkujose/apple /usr/bin/ruby -e "puts 'Hello'"
  2. /usr/bin添加到Dockerfile ENV PATH /usr/bin:$PATH中的路径我不是100%确定这是有效的,但Dockerfile中的ENV运算符应该将此环境变量添加到容器中。来源docker.com
  3. 或者,您可以在Dockerfile中将/usr/bin/ruby指定为ENTRYPOINT。那就是:ENTRYPOINT ["/usr/bin/ruby"]。然后你可以运行docker run -it jikkujose/apple -e "puts 'Hello'"注意这会导致容器默认运行/ usr / bin / ruby​​,如果你想运行ls或其他命令,你需要覆盖这个入口点。 p>

    编辑:

    下面给出了最小可行Dockerfile解决方案。我们假设/ usr / bin不在$ PATH环境变量中,它位于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'"现在在终端输出Hello

    编辑2:

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

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

    docker run的-e选项允许您指定或覆盖容器内的环境变量。请注意,您必须提供所有希望$ PATH与此方法相同的路径。

    您可能还想简单地编辑容器内的PATH变量,然后重新发送容器,以便/ usr / bin存在于容器中存储的$ PATH环境变量中。

答案 1 :(得分:1)

未正确设置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   '你好'“