我有一个用Ruby构建的图像。我可以在运行时在图像中运行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
答案 0 :(得分:2)
这可能是因为ruby可执行文件不在运行容器进程的用户的路径中(即root
或在Dockerfile中使用USER命令指定的用户)。以下两个选项可以帮助您解决问题。
docker run -it jikkujose/apple /usr/bin/ruby -e "puts 'Hello'"
/usr/bin
添加到Dockerfile ENV PATH /usr/bin:$PATH
中的路径我不是100%确定这是有效的,但Dockerfile中的ENV运算符应该将此环境变量添加到容器中。来源docker.com。或者,您可以在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 '你好'“