CentOS7(Docker)でRuby on Railsを構築しようとしたらグダグダした話

次のプロジェクトで扱うシステムがRuby on Railsで構築されている。
ruby及びrailsは全く触った事が無かったので、家で勉強しようとして、
centos7コンテナ上で実行するまでにぐだぐだした話を**端折らず**に書く。

# イメージをpull
```bash
docker pull centos:7
```

# コンテナ起動
``` bash
docker run --name test -itd -p 3000:3000 centos:7 bash
```

# コンテナに接続
``` bash
docker exec -it test bash
```

# ruby入れる
```bush
yum install ruby -y
```

```bash
ruby -v
ruby 2.0.0p648 (2015-12-16) [x86_64-linux]
```

# rails入れる
```bash
gem install rails
```
```bash

ERROR:  Error installing rails:
        i18n requires Ruby version >= 2.3.0.
```
[公式](https://guides.rubyonrails.org/getting_started.html#installing-rails)に2.5以上が必要と書いてある。バージョン指定で入れたい。

一旦rubyを消す

``` bash
yum remove ruby
```

# rbenv入れる
rubyのインストールはrbenvを入れてやるのが定石らしい
イケてる[記事](https://qiita.com/inouet/items/478f4228dbbcd442bfe8)を参考にやる

## git入れる
``` bash
yum install git -y
```

## rbenvをとってきてパスを通す
``` bash
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
exec $SHELL -l
```

```bash
rbenv -v
rbenv 1.1.2-20-g143b2c9
```

## ruby-build入れる
```bash
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```
rubyの[最新安定板は2.7.0](https://www.ruby-lang.org/ja/downloads/)らしいのでこれを選択

```bash
rbenv install 2.7.0
```
```bash
tar (child): bzip2: Cannot exec: No such file or directory
```
bzip2がないといわれたので入れる。再びrbenv installする。

```
yum install -y bzip2
```

```bash
configure: error: no acceptable C compiler found in $PATH
```
C コンパイラがないといわれたのでgccを入れ、再びrbenv installする

```bash
yum install -y gcc
```

```bash
checking if make is GNU make... ./configure: line 29860: make: command not found
```

makeがないといわれたので入れた後でrbenv installする

```bash
yum install -y make
```

```bash
BUILD FAILED (CentOS Linux 7 using ruby-build 20200115-8-g73b926b)

Inspect or clean up the working tree at /tmp/ruby-build.20200203095258.8069.mCat66
Results logged to /tmp/ruby-build.20200203095258.8069.log
Last 10 log lines:
        from ./tool/rbinstall.rb:841:in `block (2 levels) in install_default_gem'
        from ./tool/rbinstall.rb:278:in `open_for_install'
        from ./tool/rbinstall.rb:840:in `block in install_default_gem'
        from ./tool/rbinstall.rb:830:in `each'
        from ./tool/rbinstall.rb:830:in `install_default_gem'
        from ./tool/rbinstall.rb:794:in `block in <main>'
        from ./tool/rbinstall.rb:945:in `block in <main>'
        from ./tool/rbinstall.rb:942:in `each'
        from ./tool/rbinstall.rb:942:in `<main>'
make: *** [do-install-all] Error 1
```

何かで失敗
Results logged to /tmp/ruby-build.20200203095258.8069.logとのことなのでログファイルを眺める

```bash
vi /tmp/ruby-build.20200203095258.8069.log

・・・

 Could not be configured. It will not be installed.
        /tmp/ruby-build.20200203095258.8069.mCat66/ruby-2.7.0/ext/openssl/extconf.rb:97: OpenSSL library could not be found. You might want to use --with-openssl-dir=<dir> option to specify the prefix where OpenSSL is installed.
        Check ext/openssl/mkmf.log for more details.

・・・

```
OpenSSLライブラリが見つからないと言われているので入れる
[参考](https://seiryo.hatenadiary.org/entry/20071213/1197545500)

```bash
yum install -y openssl-devel

Installed ruby-2.7.0 to /root/.rbenv/versions/2.7.0
```

# rbenvで使用するrubyバージョンを設定する
```bash
rbenv global 2.7.0
```

# railsを入れる
```bash
gem install rails

・・・

rails after 30 seconds
40 gems installed
```

# アプリ作る

アプリは/opt/dockerの下に作ることにした

```bash
mkdir /opt/docker
cd /opt/docker

rails new example
```

```bash
Could not find gem 'sqlite3 (~> 1.4)' in any of the gem sources listed in your Gemfile.
         run  bundle exec spring binstub --all
bundler: command not found: spring
Install missing gem executables with `bundle install`
       rails  webpacker:install
Could not find gem 'sqlite3 (~> 1.4)' in any of the gem sources listed in your Gemfile.
Run `bundle install` to install missing gems.
```

sqlite3がないと言われるので入れようとするが

```bash
gem install sqlite3

ERROR:  Error installing sqlite3:
        ERROR: Failed to build gem native extension.

sqlite3.h is missing. Try 'brew install sqlite3',
'yum install sqlite-devel' or 'apt-get install libsqlite3-dev'
and check your shared library search path (the
location where your sqlite3 shared library is located).

```
yum install sqlite-devel しろと言われるのでする

```bash
yum install -y sqlite-devel

Installed:
  sqlite-devel.x86_64 0:3.7.17-8.el7_7.1
```
再度gem install sqlite3

```bash
Successfully installed sqlite3-1.4.2
```

戻ってrails new exampleするけど

```bash
rails new example
Could not find gem 'sass-rails (>= 6)' in any of the gem sources listed in your Gemfile.
```

sass-railsが無いといわれるので入れようとするが

```bash
gem install sass-rails

make: g++: Command not found
```

g++が無いといわれるので入れる [参考](https://notsleeeping.com/archives/863)

``` bash
yum -y install gcc-c++
```

もう一回 gem install sass-rails

``` bash
gem install sass-rails

4 gems installed
```

再びrails new example

```bash
rails new example

sh: nodejs: command not found
```

nodejsが無いといわれるので入れる [参考](https://qiita.com/daskepon/items/16a77868d38f8e585840)

```
curl -sL https://rpm.nodesource.com/setup_10.x | bash -
yum install -y nodejs

Installed:
  nodejs.x86_64 2:10.18.1-1nodesource
```

再びrails new example

```
rails new example

Yarn not installed. Please download and install Yarn from https://yarnpkg.com/lang/en/docs/install/
```

yarn入ってないって言われるので入れる

```
npm install -g yarn
```

再びrails new example

``` bash
rails new example

Done in 163.32s.
```

#railsを起動する

```
cd example
rails s

* Listening on tcp://127.0.0.1:3000
```

ブラウザでhttp://localhost:3000 にアクセスする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156655/96d68e84-9295-eeb0-e0a5-e3e32bf07526.png)


[参考](https://qiita.com/amuyikam/items/01a8c16e3ddbcc734a46)
railsは127.0.0.1:3000でリッスンする。
ホストでhttp://localhost3000 すると、コンテナには、コンテナのipアドレス172.17.0.1:3000としてフォワードされるので、127.0.0.1 ≠ 172.17.0.1 となり上手く動かない

### 127.0.0.1じゃなくてもう全部でリッスン

``` bash
rails s -b 0.0.0.0
```

ブラウザからhttp://localhost:3000 にアクセス

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156655/f823877e-3b28-b60a-6ab4-24b38c7ba4dd.png)

### sqlite3のバージョンが問題なので入れ直す
ソースコードを取ってきてlibtoolでコンパイルするらしい
[参考](https://qiita.com/8zca/items/175efb0612070530d186)

```bash
wget https://www.sqlite.org/2019/sqlite-autoconf-3290000.tar.gz

bash: wget: command not found
```

そういえばwget入れてなかったので入れて再実行する

```bash
yum install -y wget
wget https://www.sqlite.org/2019/sqlite-autoconf-3290000.tar.gz
tar xzvf sqlite-autoconf-3290000.tar.gz
cd sqlite-autoconf-3290000
./configure --prefix=/opt/sqlite/sqlite3
make

/opt/docker/example/sqlite-autoconf-3290000/missing: line 81: aclocal-1.15: command not found
```

aclocal-1.15がないと言われる。

[makeの前にautoreconf -f -iするといい](https://kotaeta.com/62363254)らしい

```bash
autoreconf -f -i

Can't exec "aclocal": No such file or directory at /usr/share/autoconf/Autom4te/FileUtils.pm line 326.
```

aclocalが無いといわれる。
automakeを入れればいいらしい。[参考](https://qiita.com/DQNEO/items/11d6056547cab0632901)

```bash
yum install -y automake

Installed:
  automake.noarch 0:1.13.4-3.el7
```

```bash
autoreconf -f -i

configure.ac:24: error: possibly undefined macro: AC_PROG_LIBTOOL
```

AC_PROG_LIBTOOLが未定義とか言われる。
[libtoolが足りないせいらしい](https://rcmdnk.com/blog/2017/04/03/computer-linux/)

```bash
yum install -y libtool

Installed:
  libtool.x86_64 0:2.4.2-22.el7_3
```

もっかいautoreconf -f -iする

```
autoreconf -f -i

libtoolize: putting auxiliary files in AC_CONFIG_AUX_DIR, `.'.
libtoolize: copying file `./ltmain.sh'
libtoolize: Consider adding `AC_CONFIG_MACRO_DIR([m4])' to configure.ac and
libtoolize: rerunning libtoolize, to keep the correct libtool macros in-tree.
libtoolize: Consider adding `-I m4' to ACLOCAL_AMFLAGS in Makefile.am
```

もっかいmake

``` bash
./configure --prefix=/opt/sqlite/sqlite3
make


libtool: link: ( cd ".libs" && rm -f "libsqlite3.la" && ln -s "../libsqlite3.la" "libsqlite3.la" )
gcc -DPACKAGE_NAME=\"sqlite\" -DPACKAGE_TARNAME=\"sqlite\" -DPACKAGE_VERSION=\"3.29.0\" -DPACKAGE_STRING=\"sqlite\ 3.29.0\" -DPACKAGE_BUGREPORT=\"http://www.sqlite.org\" -DPACKAGE_URL=\"\" -DPACKAGE=\"sqlite\" -DVERSION=\"3.29.0\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_DLFCN_H=1 -DLT_OBJDIR=\".libs/\" -DHAVE_FDATASYNC=1 -DHAVE_USLEEP=1 -DHAVE_LOCALTIME_R=1 -DHAVE_GMTIME_R=1 -DHAVE_DECL_STRERROR_R=1 -DHAVE_STRERROR_R=1 -DHAVE_POSIX_FALLOCATE=1 -DHAVE_ZLIB_H=1 -I.    -D_REENTRANT=1 -DSQLITE_THREADSAFE=1 -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_RTREE -DSQLITE_HAVE_ZLIB  -DSQLITE_ENABLE_EXPLAIN_COMMENTS -DSQLITE_ENABLE_DBPAGE_VTAB -DSQLITE_ENABLE_STMTVTAB -DSQLITE_ENABLE_DBSTAT_VTAB  -g -O2 -MT sqlite3-shell.o -MD -MP -MF .deps/sqlite3-shell.Tpo -c -o sqlite3-shell.o `test -f 'shell.c' || echo './'`shell.c
mv -f .deps/sqlite3-shell.Tpo .deps/sqlite3-shell.Po
gcc -DPACKAGE_NAME=\"sqlite\" -DPACKAGE_TARNAME=\"sqlite\" -DPACKAGE_VERSION=\"3.29.0\" -DPACKAGE_STRING=\"sqlite\ 3.29.0\" -DPACKAGE_BUGREPORT=\"http://www.sqlite.org\" -DPACKAGE_URL=\"\" -DPACKAGE=\"sqlite\" -DVERSION=\"3.29.0\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_DLFCN_H=1 -DLT_OBJDIR=\".libs/\" -DHAVE_FDATASYNC=1 -DHAVE_USLEEP=1 -DHAVE_LOCALTIME_R=1 -DHAVE_GMTIME_R=1 -DHAVE_DECL_STRERROR_R=1 -DHAVE_STRERROR_R=1 -DHAVE_POSIX_FALLOCATE=1 -DHAVE_ZLIB_H=1 -I.    -D_REENTRANT=1 -DSQLITE_THREADSAFE=1 -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_RTREE -DSQLITE_HAVE_ZLIB  -DSQLITE_ENABLE_EXPLAIN_COMMENTS -DSQLITE_ENABLE_DBPAGE_VTAB -DSQLITE_ENABLE_STMTVTAB -DSQLITE_ENABLE_DBSTAT_VTAB  -g -O2 -MT sqlite3-sqlite3.o -MD -MP -MF .deps/sqlite3-sqlite3.Tpo -c -o sqlite3-sqlite3.o `test -f 'sqlite3.c' || echo './'`sqlite3.c
mv -f .deps/sqlite3-sqlite3.Tpo .deps/sqlite3-sqlite3.Po
/bin/sh ./libtool  --tag=CC   --mode=link gcc -D_REENTRANT=1 -DSQLITE_THREADSAFE=1 -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_RTREE -DSQLITE_HAVE_ZLIB  -DSQLITE_ENABLE_EXPLAIN_COMMENTS -DSQLITE_ENABLE_DBPAGE_VTAB -DSQLITE_ENABLE_STMTVTAB -DSQLITE_ENABLE_DBSTAT_VTAB  -g -O2   -o sqlite3 sqlite3-shell.o sqlite3-sqlite3.o  -lz -lm -ldl -lpthread
libtool: link: gcc -D_REENTRANT=1 -DSQLITE_THREADSAFE=1 -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_RTREE -DSQLITE_HAVE_ZLIB -DSQLITE_ENABLE_EXPLAIN_COMMENTS -DSQLITE_ENABLE_DBPAGE_VTAB -DSQLITE_ENABLE_STMTVTAB -DSQLITE_ENABLE_DBSTAT_VTAB -g -O2 -o sqlite3 sqlite3-shell.o sqlite3-sqlite3.o  -lz -lm -ldl -lpthread
```

良く分からんことになるが続けて

```bash
make install

libtool: install: /usr/bin/install -c sqlite3 /opt/sqlite/sqlite3/bin/sqlite3
```

gem入れ直し

```bash
gem uninstall sqlite3
gem install sqlite3 -- --with-sqlite3-include=/opt/sqlite/sqlite3/include \
   --with-sqlite3-lib=/opt/sqlite/sqlite3/lib

1 gem installed
```

rails起動(再)

``` bash
cd /opt/docker/example
rails s -b 0.0.0.0

* Listening on tcp://0.0.0.0:3000
```

http://localhost:3000/ にアクセス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156655/9cc4cdcd-1a03-0955-289e-f9aec5504719.png)

やっぱ何も知らない奴がやると駄目だな！