Ubuntu 18.04 Docker镜像中Ruby 2.7.2源码安装失败求助
问题分析与解决方案
核心问题1:Dockerfile的RUN上下文隔离
每个RUN指令在独立的shell进程中执行,RUN cd ruby-2.7.2的目录切换不会延续到后续RUN,导致./ruby-2.7.2/configure实际在/root目录执行,路径错误是依赖检测失败的关键原因之一。
核心问题2:缺失编译依赖
错误提示中dbm、readline、gdbm等扩展无法编译,是因为缺少对应的开发依赖包;同时OpenSSL路径未明确指定,导致configure脚本无法识别已安装的openssl。
修正后的Dockerfile
# Pull base image. FROM ubuntu:18.04 ARG APP_NAME=<appname> # Install dependencies RUN apt-get update && \ apt-get -y upgrade && \ apt-get install -y build-essential \ openssl \ libssl-dev \ zlib1g-dev \ software-properties-common \ byobu \ curl \ git \ htop \ man \ unzip \ vim \ wget \ libffi-dev \ # 补充缺失的编译依赖 libreadline-dev \ libgdbm-dev \ libdb-dev && \ rm -rf /var/lib/apt/lists/* # 下载、解压并编译安装Ruby 2.7.2 RUN wget https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.2.tar.bz2 && \ tar -xf ruby-2.7.2.tar.bz2 && \ cd ruby-2.7.2 && \ # 指定系统默认OpenSSL安装路径 ./configure --prefix=/my/ruby/dir --with-openssl-dir=/usr && \ make && \ make install && \ # 清理安装包减少镜像体积 cd /root && \ rm -rf ruby-2.7.2 ruby-2.7.2.tar.bz2 # Set environment variables. EXPOSE 5000 ENV HOME /root ENV PATH="${PATH}:/my/ruby/dir/bin" # Define working directory. WORKDIR /root COPY ${APP_NAME}/ ./${APP_NAME}/ # Define default command. CMD ["bash"]
关键修正点说明
- 合并RUN指令:将下载、解压、编译命令放在同一个
RUN中,确保目录切换的上下文被后续命令继承。 - 补充依赖包:添加
libreadline-dev、libgdbm-dev、libdb-dev,解决readline、gdbm、dbm扩展的编译问题。 - 明确OpenSSL路径:通过
--with-openssl-dir=/usr指定系统OpenSSL位置,解决openssl扩展无法编译的问题。 - 清理冗余文件:编译完成后删除源码包和目录,压缩镜像体积。
- 修正PATH变量:将
/my/ruby/dir/bin加入PATH,确保ruby、gem等命令可直接调用。
关于rvm无法识别的补充说明
如果后续想尝试rvm,需在安装后加载初始化脚本,可在Dockerfile中添加:
RUN gpg --keyserver hkp://keyserver.ubuntu.com --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB && \ curl -sSL https://get.rvm.io | bash -s stable && \ echo "source /etc/profile.d/rvm.sh" >> ~/.bashrc
启动容器时使用bash -l作为默认命令,确保rvm被正确加载。
内容的提问来源于stack exchange,提问作者CodeJedi
相关产品推荐
相关产品推荐

