先日書いた、Docker で Rails を動かすでの問題だったWebpakerが動作しなかったのを解決しました。
作るもの
- Docker で Rails を動作する環境構築
- Webpacker 使用できます
環境構築
何ということではなく、ただ愚直にnodenvとrbenvそしてyarnを動かせるようにセットアップをします。
ベースのイメージがAmazonLinuxなのは、「まぁどうせ自分で何か作るならEC2でやるだろう」ぐらいの考えです。
Dockerfile
| 12
 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 && \
 
 
 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 && \
 
 
 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 && \
 
 
 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| 12
 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:
 
 - .:/usr/src/app:cached
 
 
 - /usr/src/app/vendor
 - /usr/src/app/tmp
 - /usr/src/app/log
 - /usr/src/app/.git
 tty: true
 
 volumes:
 bundle:
 driver: local
 
 | 
 
操作
以下の操作を実行し、Docker内でRailsを起動する。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 
 | docker-compose build
 docker-compose up -d
 docker-compose exec app bash
 
 
 bundle init
 
 
 
 bundle install --path=vendor/bundle
 bundle exec rails new .
 
 
 bundle exec rails webpacker:install
 
 
 bundle exec rails s -b 0.0.0.0
 
 | 
いつもの楽しいRailsの初期画面が表示されます。
今回は、sqliteも動かせるようにしたので、「現時点でとりあえず起動」まで持っていけます。
一部追加セットアップ
前回と同じ対応になるので、そちらを参照下さい。
dockerでcronを動かす (2020/01/27追記)
Railsでバッチを動かすときのwheneverが使われますが、とどのつまりこれはcronでの実行です。
対応方法として、docker-compose.ymlに以下の内容を追記します。
| 12
 3
 4
 5
 6
 7
 
 | services:app:
 build:
 
 
 privileged: true
 command: /sbin/init
 
 | 
パッケージとしてはsystemd-sysvとcrontabsの2つをインストール。
(↑で記載したDockerfileには記載済みです。)
以下のコマンドで、cronサービスを起動します。これで、コンテナ内でcronが使えます。
もう、今度こそなんでもできそうです。
ではでは。