先日書いた、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 && \
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.yml1 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: - .:/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を起動する。
1 2 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
に以下の内容を追記します。
1 2 3 4 5 6 7
| services: app: build: privileged: true command: /sbin/init
|
パッケージとしてはsystemd-sysv
とcrontabs
の2つをインストール。
(↑で記載したDockerfileには記載済みです。)
以下のコマンドで、cronサービスを起動します。これで、コンテナ内でcronが使えます。
もう、今度こそなんでもできそうです。
ではでは。