我有一个安装 rvm的 Docker 映像。在 中Dockerfile
,我将以下几行附加到~/.bashrc
用户的 中。
export PATH="$PATH:$HOME/.rvm/bin"
source "$HOME/.rvm/scripts/rvm"
我还让 bash 充当登录 shell。
SHELL ["/bin/bash", "-lc"]
稍后,我使用 Docker Compose 创建一个容器,并以相关用户的身份运行 shell 脚本。
entrypoint:
- /bin/bash
- '-lc'
command:
- ~/.local/bin/ci
在脚本中ci
,如果我执行source ~/.bashrc
,脚本将无法找到rvm
可执行文件。但是,如果我明确执行source "$HOME/.rvm/scripts/rvm"
,脚本将成功运行。
我的问题是,.rvm/scripts
是的一部分.bashrc
,那么,为什么采购.bashrc
不起作用?
你没有发布完整的 .bashrc,但从你的 bash -x 输出可以清楚地看出,你的 .bashrc 正在使用类似代码检查交互式会话
这是一个标准检查,可防止 .bashrc 在非交互式 shell 中生效。源 .bashrc 在执行任何其他命令(包括您添加的命令)之前返回。
为了避免这种情况,您可以将代码添加到这些行上方,这样即使在非交互式上下文中也会执行它。但是,更好的解决方案是明确地获取一个新文件,以避免摆弄 .bashrc 和相关文件。
使用 运行 CI 脚本
-x
显示.bashrc
确实是来源,所以,我不知道为什么其中的最后一个语句不起作用。我最终将 附加source "$HOME/.rvm/scripts/rvm
到~/.profile
(而不是.bashrc
),并使用 shebang 运行 CI 脚本#!/bin/bash -l
。这似乎解决了找不到可执行文件的问题,尽管我最初提出的问题仍未得到解答。-x
痕迹: