(Macでdockerを使う場合について書いています。)
Herokuにシンプルなruby製アプリをデプロイしたい
Ruby on Railsアプリの開発環境をDockerで構築してHerokuへデプロイする、という記事は結構あるのですが、ruby製アプリをHerokuにデプロイしたいだけの場合にどうすればいいのか迷ったので備忘録を残しておきます。
ruby製アプリをサーバーで公開したい場合、一番簡単なのがHerokuだと思います。無料でもあまり重くないアプリなら軽快に動いてくれます。有料プランにすればスペックもグレードアップできて手軽です。
HerokuのCLIをMacではなくdockerにインストール
Herokuへのデプロイ自体は「Herokuへデプロイ」ボタンがあったりするとすぐにデプロイできたりしますが、それがない場合やアップした後にカスタマイズしたい場合などはコマンドラインツールがあると便利です。
自分の場合、Macをあまりゴチャゴチャさせたくないので、たまにしか使わないものはdocker上に入れて整理したいと思ってしまいます。なので軽く検索したものの見つからなかったので自分でやりました。
docker-compose.yml
docker-compose用の設定です。ubuntuではなくrubyイメージをベースにします。でないとbundleなどが使えません。
version: '3'
services:
ruby:
build:
context: .
dockerfile: Dockerfile-ruby
volumes:
- ./dev:/home/app/dev
Dockerfile-ruby
公式のrubyイメージに必要な処理を追加しました。
FROM ruby:2.6.4 RUN apt-get update \ && apt-get install -y sudo \ && useradd -G sudo --user-group --create-home --shell /bin/false app \ && echo 'app:apppass' | chpasswd \ && bundle config --global frozen 1 \ && curl https://cli-assets.heroku.com/install.sh | sh ENV HOME=/home/app COPY ./Gemfile ./Gemfile.lock $HOME/ RUN chown -R app:app $HOME/* USER app WORKDIR $HOME RUN bundle install USER root COPY . $HOME RUN chown -R app:app $HOME/* USER app
apt-get install -y sudo
Herokuコマンドラインツールをインストールする際にsudoが必要になりますが、rubyイメージにはsudoがないので追加しています。
useradd -G sudo –user-group –create-home –shell /bin/false app
ユーザ「app」を追加しています。sudoが使えるように、useraddに「-G」をつけてsudoを使用できるようにしておきます。
echo ‘app:apppass’ | chpasswd
chpasswdでパスワード設定しておくことも忘れずに。
curl https://cli-assets.heroku.com/install.sh | sh
Herokuコマンドラインツールをインストールしています。これでインストール済みのdockerイメージを作成できます。
dockerを立ち上げる
上記のファイルを作成した上でdocker-composeを起動すれば、herokuコマンドが使えて、rubyも実行できる環境が立ち上がります。
% docker-compose build
: Installing CLI from https://cli-assets.heroku.com/heroku-linux-x64.tar.xz % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 17.0M 100 17.0M 0 0 2084k 0 0:00:08 0:00:08 --:--:-- 2781k v11.14.0 heroku installed to /usr/local/bin/heroku :
% docker-compose run --rm ruby /bin/bash
「run –rm」で実行すると、exitで終了したときにイメージを破棄してくれるので楽です。
$ heroku CLI to interact with Heroku VERSION heroku/7.29.0 linux-x64 node-v11.14.0 USAGE $ heroku [COMMAND] COMMANDS access manage user access to apps addons tools and services for developing, extending, and operating your app apps manage apps on Heroku :
まとめ
使う度にインストールして、必要なくなれば全部削除する、というのでももちろん問題ないと思います。
公式に削除方法も説明されています。
% rm -rf /usr/local/heroku /usr/local/lib/heroku /usr/local/bin/heroku ~/.local/share/heroku ~/Library/Caches/heroku
homebrewでインストールした場合の削除方法もあります。
% brew uninstall heroku % rm -rf ~/.local/share/heroku ~/Library/Caches/heroku
自分としてはdockerでできるようにすることで、他にも応用が効くのでやってみたかったというのが一番の理由です。Herokuのように削除方法が載っていないようなツールをインストールする必要がある場合、消しきれないファイルが残ってしまったりするのが以前からどうにかしたいと思っていました。
ただ、やりたいことは実現できたものの、今回の方法ではdockerイメージが1GBくらいになります。rubyではなくruby:alpineを使用したり、キャッシュを消したりすれば容量はもっと減らせるようですが、今回はCLIをdockerに入れるのが目的なので、これで良しとしています。
コメント