Docker で Rails を動かす(その2)

先日書いた、Docker で Rails を動かすでの問題だったWebpakerが動作しなかったのを解決しました。

作るもの

  • Docker で Rails を動作する環境構築
  • Webpacker 使用できます

環境構築

何ということではなく、ただ愚直にnodenvとrbenvそしてyarnを動かせるようにセットアップをします。
ベースのイメージがAmazonLinuxなのは、「まぁどうせ自分で何か作るならEC2でやるだろう」ぐらいの考えです。

Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
FROM amazonlinux:latest

ARG NODE_V="14.10.0"
ARG RUBY_V="3.0.0"

RUN yum update -y && \
yum install -y wget which systemd-sysv crontabs && \
wget https://kojipkgs.fedoraproject.org//packages/sqlite/3.8.11/1.fc21/x86_64/sqlite-devel-3.8.11-1.fc21.x86_64.rpm && \
wget https://kojipkgs.fedoraproject.org//packages/sqlite/3.8.11/1.fc21/x86_64/sqlite-3.8.11-1.fc21.x86_64.rpm && \
yum install -y sqlite-3.8.11-1.fc21.x86_64.rpm sqlite-devel-3.8.11-1.fc21.x86_64.rpm && \
yum install -y git tar gcc gcc-c++ make openssl-devel zlib-devel sqlite sqlite-devel bzip2 readline-devel mysql-devel && \

# Node.js設定
git clone https://github.com/nodenv/nodenv.git ~/.nodenv && \
echo 'export PATH="$HOME/.nodenv/bin:$PATH"' >> ~/.bash_profile && \
source ~/.bash_profile && \
echo 'eval "$(nodenv init -)"' >> ~/.bash_profile && \
source ~/.bash_profile && \
mkdir -p "$(nodenv root)"/plugins && \
git clone https://github.com/nodenv/node-build.git "$(nodenv root)"/plugins/node-build && \
nodenv install $NODE_V && \
nodenv global $NODE_V && \
npm install yarn && \

# Ruby設定
git clone https://github.com/rbenv/rbenv.git ~/.rbenv && \
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile && \
source ~/.bash_profile && \
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile && \
source ~/.bash_profile && \
mkdir -p "$(rbenv root)"/plugins && \
git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build && \
rbenv install $RUBY_V && \
rbenv global $RUBY_V && \

# Yarn設定
wget https://dl.yarnpkg.com/rpm/yarn.repo -O /etc/yum.repos.d/yarn.repo && \
curl --silent --location https://rpm.nodesource.com/setup_6.x | bash - && \
yum install yarn -y

ENV PATH /root/.rbenv/shims:/root/.rbenv/bin:/root/.nodenv/shims:/root/.nodenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

# 作業ディレクトリ作成、設定
RUN mkdir /usr/src/app
WORKDIR /usr/src/app

EXPOSE 3000

Docker-compose.yml

導入するNode.jsとRubyのバージョンをargsで指定できるようにしました。
リリースバージョンを調べて設定します。

Docker-compose.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
version: "3"
services:
app:
build:
context: .
dockerfile: Dockerfile
args:
- NODE_V=14.10.1
- RUBY_V=2.7.0
privileged: true
command: /sbin/init
ports:
- "127.0.0.1:3000:3000"
volumes:
# :cached を付与して、高速化
- .:/usr/src/app:cached
# vendor以下などホストと連携しなくてもよいものを、上書きして永続化の対象外にする。
# exclude volumes
- /usr/src/app/vendor
- /usr/src/app/tmp
- /usr/src/app/log
- /usr/src/app/.git
tty: true

volumes:
bundle:
driver: local

操作

以下の操作を実行し、Docker内でRailsを起動する。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 任意ディレクトリでに↑で示したDockerfileとdocker-compose.ymlを置いてから
docker-compose build
docker-compose up -d
docker-compose exec app bash

# 以下コンテナ内操作
bundle init

# Gemfileの中の gem 'rails' のコメントを削除

bundle install --path=vendor/bundle
bundle exec rails new .
# <= Y

bundle exec rails webpacker:install

# コンテナ外からアクセスするために、-b 0.0.0.0 を付与する
bundle exec rails s -b 0.0.0.0

いつもの楽しいRailsの初期画面が表示されます。
今回は、sqliteも動かせるようにしたので、「現時点でとりあえず起動」まで持っていけます。

一部追加セットアップ

前回と同じ対応になるので、そちらを参照下さい。

dockerでcronを動かす (2020/01/27追記)

Railsでバッチを動かすときのwheneverが使われますが、とどのつまりこれはcronでの実行です。

対応方法として、docker-compose.ymlに以下の内容を追記します。

1
2
3
4
5
6
7
services:
app:
build:
# 何か設定
# 以下2行を追記
privileged: true
command: /sbin/init

パッケージとしてはsystemd-sysvcrontabsの2つをインストール。
(↑で記載したDockerfileには記載済みです。)

以下のコマンドで、cronサービスを起動します。これで、コンテナ内でcronが使えます。

1
systemctl start crond

もう、今度こそなんでもできそうです。
ではでは。