rails centos docker镜像制作 踩坑记

rails的镜像在docker hup上有也不少,为什么还要自己制作呢?因为我使用生产环境使用了oracle数据库,rails需要连接oracle数据,原本我已经下载已经安装好rails镜像,但是镜像系统是Ubuntu。ubuntu安装oracle客户端百度了一下貌似比较麻烦,况且我之前在red hat 环境下安装过rails环境,那就自己动手来写一个rails的docker file:

#使用centos7.6
FROM centos:7.6.1810
#安装需要使用的包,这里我是参考rvm安装是对系统的要求
RUN yum -y install which net-tools libaio
RUN yum -y install patch autoconf automake bison bzip2 gcc-c++ libffi-devel libtool make patch readline-devel, sqlite-devel zlib-devel glibc-headers glibc-devel openssl-devel wget
#下载ruby源码包
RUN cd;wget http://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.1.tar.gz
#安装及编译
RUN cd;tar zxvf  ruby-2.6.1.tar.gz;cd ruby-2.6.1;./configure  --prefix=/opt/ruby;make && make install
#配置文件连接,这样登录进入就可以ruby,否则将提示找不到命令
RUN ln -s /opt/ruby/bin/ruby /usr/bin/ruby;\
    ln -s /opt/ruby/bin/gem /usr/bin/gem;\
    ln -s /opt/ruby/bin/bundle /usr/bin/bundle;\
    ln -s /opt/ruby/bin/rake /usr/bin/rake;\
    ln -s /opt/ruby/bin/erb /usr/bin/erb;\
    ln -s /opt/ruby/bin/irb /usr/bin/irb
#安装最近的rails
RUN gem install rails
#安装连接MySQL数据库所需要的包
RUN yum -y install mysql mysql-devel
RUN gem install 'mysql2'
#从宿主机复制oracle客服端的RPM安装包,这里我使用的是12.1的安装包
COPY oracle*rpm /root/
#安装oracle客户端
RUN rpm -ivh /root/oracle*rpm
#设置oracle环境变量,否则安装ruby-oci8时找不到oracle客户端目录
ENV ORACLE_BASE=/usr/lib/oracle/12.1
ENV ORACLE_HOME=/usr/lib/oracle/12.1/client64/
ENV LD_LIBRARY_PATH=$ORACLE_HOME/lib:$ORACLE_HOME
ENV NLS_LANG=AMERICAN_AMERICA.UTF8
RUN echo "ORACLE_BASE=/usr/lib/oracle/12.1\nORACLE_HOME=/usr/lib/oracle/12.1/client64/\nLD_LIBRARY_PATH=$ORACLE_HOME/lib:$ORACLE_HOME\nNLS_LANG=AMERICAN_AMERICA.UTF8">>/root/.bash_profile
RUN mkdir -p /usr/lib/oracle/12.1/client64/lib/sdk/include/;cp /usr/include/oracle/12.1/client64/* /usr/lib/oracle/12.1/client64/lib/sdk/include/
#安装ruby连接oracle的gem包
RUN gem install 'ruby-oci8'
#bundle install 一个宿主机的gemfile
COPY Gemfile /opt/app/
RUN cd /opt/app/;bundle install
RUN mkdir -p /app
VOLUME /app
RUN ln -s /opt/ruby/bin/rails /usr/bin/rails
WORKDIR /app

总结一下这个过程踩得坑:

因为dockerfile中的RUN命令执行的时候,没有加载.bash_profile。正如我刚开始使用rvm安装,rvm是安装上了但是直接使用rvm命令时,会提示:

#/bin/sh: rvm: command not found

必须带绝对路径,但是加载绝对路径后使用“rvm use” 命令又会报错:

RVM is not a function, selecting rubies with 'rvm use ...' will not work.

所以最后我放弃了这种方式安装ruby。

之后我使用yum方式安装为了使用最新的ruby版本使用了centos-release-scl-rh 源:

yum install centos-release-scl-rh
yum install rh-ruby24

使用这种方式我又踩入一个新坑 scl(CentOS官方的Software Collections),SCL安装软件时不会替换系统的核心文件,保证了系统的稳定性,所以要使安装好的ruby生效还需要执行下面命令:

scl enable rh-ruby24 bash

但是在dockerfile中使用该命令后还是不生效ruby命令还是找不到,我又放弃这种安装方式。

最后使用源码安装的方式,也就是上面一开始dockerfile内容。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值