运行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命令指定的用户)。 以下两个选项可能会帮助您解决问题。
- 运行容器时指定ruby二进制文件的完整path。
docker run -it jikkujose/apple /usr/bin/ruby -e "puts 'Hello'"
- 将
/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'“