Process Composeを使ってみた(Railsを例に)
docker-composeは決まった形式でプロセスの起動方法を書けるので便利ですが、
手元のPCに開発環境を作る場合など、
プロセスの起動管理をしたいだけの時は、docker前提だとtoo-muchで扱いにくい事も多いです。
調べてみるとdocker前提で無くdocker-composeライクに起動管理するツールがありました。
Process Compose | GitHub
https://github.com/F1bonacc1/process-compose
本エントリでは、このツールの使い方をRailsの開発環境構築を例に紹介します。
DBMSにMySQL、SideKiqとRedisの起動も設定します。
試した環境は以下の通りです。
- ubuntu 20.04 (WSL)
- ruby 3.1.2p20
- Rails 7.0.4.3
Process Composeのインストール
Process Composeのインストールは、
GitHubのリリースから該当するOSのバイナリをダウンロード・展開・適当なディレクトリに配置でOKです。
Releases | Process Compose | GitHub
https://github.com/F1bonacc1/process-compose/releases
例えば、以下のような手順になります。
Version/OS/インストール先は適切なものに置き換えてください。
wget https://github.com/F1bonacc1/process-compose/releases/download/v0.43.1/process-compose_0.43.1_Linux_x86_64.tar.gz
tar zxf process-compose_0.43.1_Linux_x86_64.tar.gz
cp process-compose $HOME/bin
以下のコマンドでヘルプが表示できていれば、インストール完了です。
process-compose --help
MySQLのセットアップ
MySQLは以下からダウンロードしたものを利用します。
MySQL Community Downloads
https://dev.mysql.com/downloads/mysql/
ここでは、次の条件で取得したファイルを使用します。
- Operating System: Linux - Generic
- OS Version: Linux - Generic (glibc 2.12)(x86, 64-bit)
例えば、以下のような手順になります。
Version/OS/インストール先は適切なものに置き換えてください。
cd $HOME/opt
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.33-linux-glibc2.12-x86_64.tar.xz
tar Jxf mysql-8.0.33-linux-glibc2.12-x86_64.tar.xz
以下のコマンドでバージョンが表示できていれば、完了です。
$HOME/opt/mysql-8.0.33-linux-glibc2.12-x86_64/bin/mysql --version
Redisのセットアップ
Redisは以下の手順でセットアップします。
Install Redis from Source | redis.io
https://redis.io/docs/getting-started/installation/install-redis-from-source/
上記サイトの内容と同じですが、以下のようなコマンドです。
cd $HOME/opt
wget https://download.redis.io/redis-stable.tar.gz
tar -xzvf redis-stable.tar.gz
cd redis-stable
make
以下のコマンドでバージョンが表示できていれば、完了です。
$HOME/opt/redis-stable/src/redis-server --version
Railsアプリの作成
それでは、Railsアプリを作っていきます。
アプリの作成
railsコマンドがインストールされているRuby環境で、以下のコマンドを実行します。
DBMSはmysqlとして作成します。
rails new process-compose-study --database=mysql --skip-bundle
cd process-compose-study
bundle install --path vendor/bundle
DBの作成と設定追加
db/mysql配下に、本アプリ用のDBファイルを作成します。
mkdir db/mysql
echo "db/mysql" >> .gitignore
$HOME/opt/mysql-8.0.33-linux-glibc2.12-x86_64/bin/mysqld --initialize-insecure --datadir=$(pwd)/db/mysql
config/database.yml
にsocketの設定を追加します。
development:
<<: *default
database: process_compose_study_development
socket: /tmp/mysql.sock
Sidekiqの設定追加
以下のように、sidekiqのGemを追加します。
echo "gem 'sidekiq', '<8'" >> Gemfile
bundle install --path vendor/bundle
config/initializers/sidekiq.rb
を追加してSidekiqの設定を記載します。
Sidekiq.configure_server do |config|
config.redis = { url: 'redis://127.0.0.1:6379' }
end
Sidekiq.configure_client do |config|
config.redis = { url: 'redis://127.0.0.1:6379' }
end
Process Composeの導入
それでは、Process Composeを導入します。
作成したRailsアプリで起動が必要なプロセスは以下の4つです。
- mysqld
- redis-server
- rails webサーバ
- sidekiqプロセス
ファイルの準備
process-compose.yaml
を追加して、以下の内容を記載します。
記載ルールは、Process ComposeのREADMEに書いてありますが、
docker-composeを使ったことがある人は、なんとなく分かると思います。
version: "0.5"
processes:
rails:
command: bundle exec rails s
sidekiq:
command: bundle exec sidekiq
depends_on:
redis:
condition: process_healthy
mysqld:
command: $MYSQL_HOME/bin/mysqld --datadir=$(pwd)/mysql-data
shutdown:
command: $MYSQL_HOME/bin/mysqladmin -u root shutdown
readiness_probe:
exec:
command: $MYSQL_HOME/bin/mysqladmin -u root ping
redis:
command: $REDIS_HOME/redis-server
readiness_probe:
exec:
command: $REDIS_HOME/redis-cli ping
.env
ファイルを追加して、MySQLとRedisのインストール先を記載しておきます。
MYSQL_HOME=※略※/opt/mysql-8.0.33-linux-glibc2.12-x86_64
REDIS_HOME=※略※/opt/redis-stable/src
実行
次のように起動します。
process-compose
オプション無しで起動すると、次のような画面が表示されます。
プロセスを選んで、画面下側のキー(F7,F9,Ctrl-R等)を押すことで起動制御できます。
「-t=false」オプションをつけて起動すると、
docker-compose upと同じように標準出力にログが表示され、Ctrl-Cで終了させるようにも出来ます。
process-compose -t=false
試してないですが、 コマンドライン、REST APIによるプロセス操作も可能なようです。
Railsアプリへのアクセス
Railsアプリ用のデータベースもを作成して居なかったので、
mysqldが起動している状態で以下のコマンドを入力し、DBを作成します。
$HOME/opt/mysql-8.0.33-linux-glibc2.12-x86_64/bin/mysql -u root
> create database process_compose_study_development;
http://localhost:3000/
からRailsアプリにアクセスします。
さいごに
docker-composeを使う場合に比べると、
コンテナによる不必要な複雑さから解放されるメリットは大きいのかなと思います。
このエントリでは、ミドルウェア類を開発PCにセットアップする流れで説明しましたが、
セットアップの手間を嫌うのであれば、ProcessComposeからdocker runしてコンテナ利用でも良いと思います。
以上。