我已按照these的说明在ruby
映像上安装debian9
(我需要ruby
的旧版本,即2.1.5
)
我还包括一个额外的步骤,以便在登录所有用户后即可使用它,即
echo "source /etc/profile.d/rvm.sh >> /etc/profile"
现在,当我登录到终端后运行容器时,ruby
可用:
$ docker run -ti registry/container:tag bash
root@f6805551226c:/# ruby -v
ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-linux]
但是,当我在没有显式登录的情况下运行容器时,ruby
显然不可用,因为该文件不是源文件
docker run -it registry/container:tag ruby -v
docker: Error response from daemon: OCI runtime create failed: container_linux.go:344: starting container process caused "exec: \"ruby\": executable file not found in $PATH": unknown.
我该如何解决?
答案 0 :(得分:0)
/etc/profile
仅在用户登录到外壳程序时有效:
docker run -it registry/container:tag ruby -v
只会将ruby -v
设置为容器的PID1
,而不是将shell
用作容器的PID1
,因此/etc/profile
将无法正常工作。
仅下一个可行:
docker run -it registry/container:tag bash -c "ruby -v"
使用docker run -ti registry/container:tag bash
时,PID1
是bash,因此/etc/profile
会生效,因此您可以在路径中放置红宝石。
答案 1 :(得分:0)
通过使用ENV
指令并自行设置PATH
变量来检查是否可以解决这些问题。它在以下问题上对我有用:Why dockered centos doesn't recognize pip?,在实践中,Docker文档中也提到了它:
Best practices for writing Dockerfiles
ENV
要使新软件更易于运行,可以使用
ENV
为容器安装的软件更新PATH
环境变量。例如,ENV PATH /usr/local/nginx/bin:$PATH
确保CMD ["nginx"]
正常工作。