Rails集成R应用Docker化:Ruby镜像安装R报错如何解决
问题原因解析
1. 基于Ruby镜像安装R失败的原因
你用的ruby:2.7.1官方镜像底层是**Debian 10(Buster)**发行版,但你手动添加的是Ubuntu 18.04(Bionic)的CRAN软件源,跨发行版的软件源会导致依赖版本完全不匹配,触发依赖冲突自然无法安装r-base相关包。另外你执行apt-get install r-base没有加-y参数,也会因为需要人工确认安装步骤而失败。
2. 基于R镜像安装Ruby失败的原因
你犯了两个环境变量的顺序错误:
- 你先把rbenv克隆到了
~/.rbenv路径,执行克隆操作时你还没有定义HOME环境变量,默认root用户的HOME是/root,rbenv实际被安装到了/root/.rbenv路径下 - 后续你把
HOME改成了/home/shalev,配置的PATH指向的是/home/shalev/.rbenv路径,和实际安装路径不一致,自然找不到rbenv命令。另外Docker的RUN指令默认使用非交互式shell,不会加载.bashrc配置,你写进.bashrc的环境变量在构建阶段根本不会生效。
修复方案
方案一(基于Ruby镜像安装R的修复版Dockerfile)
FROM ruby:2.7.1 AS rails-toolbox RUN apt-get update -qq && apt-get install -y --no-install-recommends \ build-essential \ libpq-dev \ nodejs \ apt-utils \ apt-transport-https \ wget \ gnupg2 \ ca-certificates # 添加Debian 10对应的CRAN源 RUN wget -qO- https://cloud.r-project.org/bin/linux/debian/marutter_pubkey.asc | gpg --dearmor > /usr/share/keyrings/cran-archive-keyring.gpg RUN echo "deb [signed-by=/usr/share/keyrings/cran-archive-keyring.gpg] https://cloud.r-project.org/bin/linux/debian buster-cran40/" >> /etc/apt/sources.list.d/cran.list RUN apt-get update && apt-get install -y r-base RUN mkdir /app WORKDIR /app ADD shalev/Gemfile /app/Gemfile ADD shalev/Gemfile.lock /app/Gemfile.lock RUN bundle install --without development test doc --jobs=4 COPY shalev/ /app/
方案二(基于R镜像安装Ruby的修复版Dockerfile)
FROM rocker/r-ver:3.6.3 # 先定义HOME变量,保证后续操作都基于这个路径 ENV HOME /home/shalev ENV RUBY_VERSION 2.7.1 # 提前把rbenv路径加入PATH ENV PATH "$HOME/.rbenv/bin:$HOME/.rbenv/shims:$PATH" RUN apt-get update -qq && apt-get install -y --no-install-recommends \ apt-utils \ apt-transport-https \ build-essential \ libpq-dev \ nodejs \ git-core \ zlib1g-dev \ libssl-dev \ libreadline-dev \ libyaml-dev \ libsqlite3-dev \ sqlite3 \ libxml2-dev \ libxslt1-dev \ libcurl4-openssl-dev \ software-properties-common \ libffi-dev \ yarn \ curl \ bzip2 # 克隆rbenv到指定HOME路径 RUN git clone https://github.com/rbenv/rbenv.git $HOME/.rbenv RUN mkdir -p "$(rbenv root)"/plugins \ && git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build RUN rbenv install $RUBY_VERSION RUN rbenv global $RUBY_VERSION RUN mkdir /app
内容的提问来源于stack exchange,提问作者Spätzle
相关产品推荐
相关产品推荐

