设置非root用户后构建dev container执行post-install提示gem not found
问题根因
- 执行post-install流程时默认使用
/bin/sh -c调用命令,不会加载RVM所需的环境配置:RVM安装的ruby、gem等二进制文件路径仅在加载RVM初始化脚本(/etc/profile.d/rvm.sh、用户.bashrc)后才会加入PATH变量,非登录态的sh不会主动加载这些配置,因此系统找不到gem命令。 - Dockerfile中设置的
SHELL ["/bin/bash", "-l", "-c"]仅作用于镜像构建阶段的RUN指令,不会影响容器启动后post-install脚本的执行shell。 - RVM默认安装的ruby为非全局版本,未加载RVM环境时系统默认路径中不存在对应可执行文件。
解决方案
可选择以下任意一种方案修复:
方案1(修改成本最低):调整post-install命令的执行shell
在devcontainer配置(devcontainer.json)中将原post-install命令外层套上登录态bash调用,示例如下:
"postCreateCommand": "bash -l -c 'gem install bundler -v 1.17.3 && bundle install && rake db:create && rake db:migrate && rake assets:precompile && rake db:seed'"
该方案无需修改Dockerfile,直接让post-install命令加载用户环境变量即可正常执行。
方案2:将RVM环境配置为全局生效
在现有Dockerfile中补充RVM全局环境配置,让所有shell类型都能找到ruby、gem命令:
在Dockerfile的# install RVM步骤后添加以下代码:
# 配置RVM全局生效 RUN echo 'source /etc/profile.d/rvm.sh' >> /etc/bash.bashrc && \ echo 'source /etc/profile.d/rvm.sh' >> /etc/profile && \ # 设置默认ruby版本 /bin/bash -l -c "rvm alias create default 2.3.8" # 把RVM路径加入全局环境变量 ENV PATH="/usr/local/rvm/rubies/default/bin:/usr/local/rvm/gems/default/bin:/usr/local/rvm/bin:$PATH"
修改后重新构建镜像即可,post-install不需要额外调整。
内容的提问来源于stack exchange,提问作者Nolan Mayersky
相关产品推荐
相关产品推荐

