どうも、Dockerでいろいろやってます。そのなかでRails製のアプリサーバー(たぶん)のunicornを使おうとしたのですが、いろいろ詰まりました。半分日記みたいなもんです。
unicornってのはあれですね、GitHubが落ちたときに表示されるキモイロゴのやつですね。

何がしたいのか


今は下記のような構成でRedmineを構築しようとしています。

  • Nginx
  • MariaDB
  • Redmine (rails + unicorn)

で、各々のアプリケーションは同一コンテナではなく、別のコンテナに分離しDocker composeでまとめようとしています。
unicornに関係ないのでどうでもいい話ですが、各アプリケーションのコンテナのデータ(ログやデータベースのデータ)はさらに専用のストレージコンテナに分離します。

この辺りは、完成したらそのうち記事に書こうと思います。
なお、作成中のものはこちら

unicorn起動できません…


こうやって、unicorn起動しようとしたら

1
bundle exec unicorn_rails -c /usr/src/app/redmine-3.3.0/config/unicorn.rb -E production -D

こんなエラーが出るんですよ…

1
bundler: failed to load command: unicorn (/usr/local/bundle/bin/unicorn) Gem::Exception: can't find executable unicorn

こんなの言われても「unicornインストールしてるよ!ふざけんなコラ!」とこの時点で他の要素も絡んでかなり消耗していたので怒りマックスで禿げ上がりそうだったのですが、落ち着いて調べることに。

結論から書くとGemfileunicornを記述していなかったのが原因でした。

nginx + unicorn + Railsの設定方法

上の記事をみて気が付いた。
「もしかして、サーバー自体にunicornインストールしててもアプリケーションのGemfileの方にunicronインストールする旨をかかねばいかんのでは…」と。

結果はその通りで、RedmineのGemfileにgem "unicorn"を記述すると動きました…

なぜGemfileに書かなかったのか


実はアプリケーションのGemfileに使用するパッケージを記述するというのは知ってました。

でも、私は「Gemfileに書かなくてもサーバー自体にパッケージがインストールされて入ればよい」と思い込んでいたので、Dockerのイメージ作成時にサーバーにインストールするようにしていました。
だって、可能な限りRedmineのコードに変更入れたくなかったんだもん…

その他


Dockerの話になりますが、これはかなりムズイですね。特にコンテナ分離したり、コンテナ分離したり、コンテナ分離したら…
JenkinsみたいにDocker職人が必要になるのでは…

公式イメージを動かすだけなら簡単なんですが…

ちなみに、Redmineの公式イメージも存在します。
が、フロントにNginxをつかってなかったり、Railsサーバーがショボかったりで一から自作してます…MariaDBに関しては公式イメージを使ってますが…