■ docker-composeで落ちる場合の対処
こんにちは咲矢です。
Webアプリの作成に挑戦されている方の中には、Ruby on Rails をDocker環境で開発したいと考えている方もいるかと思います。
ところが、「Dockerfile」や「docker-compose.yml」ファイルを用意して、いざビルドをした時に、エラーでイメージの作成に失敗することがあると思います。
また、ビルドが通っても、docker-compose upした際にエラーが出てコンテナが立ち上がらないなどは、あるあるだと思います。
ローカル環境ならエラーに対して一つ一つ対処していけばなんとかできるというレベルの方でも、Docker環境だとビルドやコンテナの立ち上げに失敗してしまうと、コンテナの中身を修正することもできないので途方に暮れることでしょう。
今回はそんなDocker on Railsでありがちな環境構築の罠への対処を紹介したいと思います。
■ Dockerfileの記述
ビルドに失敗するときはDockerfileの記述を見直しましょう。
DockerfileにはLinuxコマンドを記述します。
慣れていない初学者の方は、とりあえず参考サイトからコピペしたけどうまく行かないなんてことも多いでしょう。
そうすると、時には解説のためのコメント、全角スペースなどが混ざっていることもあります。
インデントや余計な行番号の挿入なども起こりえます。
今一度、文法の誤りが無いかチェックしましょう。
文法ミス以外に考えられるのは、参考サイトの内容が古い場合が考えられます。
Webアプリ開発は、時代の流れが早いジャンルなので、バージョンが変わると思うように動かない場合があります。
記事の製作者の方は、安定して動くように、バージョンを固定して解説してくださっている方もたくさんいらっしゃいます。
しかし、それでもうまく行かない場合もあります。
その時はバージョンを変えて試行錯誤する必要があります。
RUNコマンドでインストールしている機能の、バージョンを見直したり、FROMコマンドで引っ張ってきている土台となるイメージそのもののバージョンを見直しましょう。
■ docker-compose upできない
イメージのビルドに無事成功してdocker-compose upをしたら、なぜかエラーが出てしまうことがあると思います。
Railsだと最初の立ち上げ時に、必要なGemがないからコンテナが落ちるとか、よくあると思います。
でもコンテナが立ち上がらないと、コンテナに対して操作することもできない。。
困った!
そんな時に使えるのが
docker-compose run --rm
コマンドです
1 |
docker-compose run --rm [コンテナ名] [コマンド] |
の形式で、実行したい[コマンド]を記述します。
こうすることで、コンテナの立ち上げ時に実行したい操作を指示できます。
[コンテナ名]はdocker-compose.ymlのservices:で命名した名前を使ってください。
例えば、Railsを起動するにはwebpackerが必要になるので、
railsのコンテナ名がwebだとすると、
1 |
docker-compose run --rm web rails webpacker:install |
となります。
「web」というコンテナに対して、
「rails webpacker:install」コマンドを、
「一度きりのコンテナを立ち上げて実行する」
という意味になります。
このコマンドの実行により、webpackerが無いために立ち上がらなかったコンテナが立ち上がるようになります。
この機能を使うことによって、機能をインストールしたいけど、コンテナが立ち上がらないからインストールできないという、相反する状況から抜け出すことができます。
■ docker-compose run –rm web って?
docker-compose run –rm web [コマンド]が何をしているかというと、
「停止したら削除される一度きりのコンテナを立ち上げる」ということです。
そして、あとに続く[コマンド]はコンテナ立ち上げ時に実行してくれる命令となります。
必要な機能のインストールを、このコマンド部分で指示する事により、コンテナを立ち上げつつ必要なファイルの生成を行ってくれます。
このコンテナは、すぐに削除されてしまいますが、エラーの解消に必要な操作を、すでに実行してくれています。
この作業の後、
1 |
docker-compose up |
すれば無事起動します。
docker-compose run –rm [コンテナ名] [コマンド]
は、dockerで開発環境を構築する際に、結構な頻度でお世話になります。
rails new をするときにも必要になりますね。
例えば、webという名前のrailsコンテナで、データベースにMySQLを使用するプロジェクトを立ち上げたいときは、
1 |
docker-compose run web rails new . --force --database=mysql |
となります。
■ まとめ
docker-composeが失敗するときのトラブルシューティングを紹介しました。
場合によっては、docker-compose run に –rm オプションを指定していない解説もあるので、自身がやりたい作業の、公式ドキュメントや参考サイトの情報を頼りに試行錯誤してみましょう。
毎回新規プロジェクトを立ち上げる時に見返す情報なので、備忘録的な意味も込めて書き留めてみました。
docker-composeしたいのにできないと、悩んでいる方の参考になれば幸いです。
Docker関連記事:【Rails】開発環境を移行したら立ち上がらないを解決する
コメント