Dockerに詳しくない人間がDocker起動ができなくなった環境を直すまでの長い物語。


まずはじめに。

※物語を別に読みたくない人、解決方法を知りたい方は下記リンクで解決内容にまで飛びます。
解決方法

※この記事には今を生きるAくんと過去を生きているBくんがいます。
※AくんとBくんは同一人物です。
※物語としてAくんとBくんの会話は成り立ってるように調整していますが、実際には会話ができてるわけではないです。
※Aくん = 今の自分、 Bくん = 過去の自分

エピソード1 Dockerが起動しない

Bくん
Dockerを使って開発をしていました。

久々にそのリポジトリで実装対応があり、今まで通りDockerを使って開発をしようとしたところ、

Dockerが起動できずにエラーが出るように・・・

エラー内容

Bundler::GitError: The git source git://github.com/carrierwaveuploader/carrierwave.git is not yet checked out. Please run `bundle install` before trying to start

なにこれ?

bundle installしてよ!的なことを言ってるけど、bundle installしたらええのか?

Docker起動から抜けて、

$ bundle install

を実行。

その後再度、Dockerを起動するものの同じエラーが出る。

Bくん
「なんでできないのか謎だわ〜」

Aくん
「いや、そりゃそうでしょ、ここでのエラーはDockerコンテナ内での話をしてるのになんで、Docker起動から抜けて"bundle install"しとるんや?」
「それをやるなら"Dockerfile"内で"bundle install"してやらんとあかんでしょ?」

Bくん
「あー、そういうことなのね。でも、"Dockerfile"内で"bundle install"してるよ。」

Aくん
「じゃあ、エラーの内容はそこではないね。エラー文から他の原因を探すしかないよ」

Bくん
「そうだな。もう一度見てみるか」

エピソード2 エラー内容ググる

エラー内容

Bundler::GitError: The git source git://github.com/carrierwaveuploader/carrierwave.git is not yet checked out. Please run `bundle install` before trying to start

Bくん
「上記がエラー内容だけど、"bundle install" だけどそれはさっきやってそこじゃなかったから他のところか〜」
「とりあえずググってみるかな〜」

ググってみるものの、此れと言って同じように該当するものが見当たらない・・・
エラー内容から何かヒントがないか探してみる。

「git://github.com/carrierwaveuploader/carrierwave.git これが結局なんか checked out できないからダメなのか?」

Aくん
「おっ!そ言うことなのでは?じゃあ、次はなにをして解決にたどり着くかな?」

Bくん
「とりあえず、grepとかかけたけど、ヒットしないなー。」

Aくん
「grepの仕方を変えてみればいいんじゃない?」

Bくん
「お!なんかヒットしたぞ。ファイルは...GemfileとGemlockfile.lock...」

※実際にはここでの調査だったり、試行錯誤がめちゃくちゃ時間を取られてハマってます。

エピソード3 gemファイルを見てみる

特定の場所がヒットしてたけどその部分は

Gemfile

gem 'carrierwave', github: 'carrierwaveuploader/carrierwave', tag: 'v1.2.2'

Gemfilel.lock

GIT
  remote: https://github.com/carrierwaveuploader/carrierwave.git

とあった。

Bくん
「これでなんで checked out できないんだ?」

Aくん
「GemfileとGemfilel.lockで書き方が違くない?」

Bくん
「そうなの?まあ、確かに違うと入れれば違うけど。」

Aくん
「Gemfileの書き方をhttpsで書いてみたら?」

Bくん

gem 'carrierwave', :git => 'https://github.com/carrierwaveuploader/carrierwave.git', tag: 'v1.2.2'

こう言うこと?

Aくん
「そうだね。」

エピソード4 再実行してみる

Bくん
「修正してみたから、再度Docker起動してみるか。」

$ docker-sync-stack start

これでどうかなー。。。

エラー内容

Bundler::GitError: The git source git://github.com/carrierwaveuploader/carrierwave.git is not yet checked out. Please run `bundle install` before trying to start

Bくん
「ダメじゃないかー!!!なんでやねん!!!」

Aくん
「一回、docker再起動とかしてみた?」

Bくん
「してない!!!」

Aくん
「してみて!!!!」

Bくん

$ docker-compose down

$ docker system prune

$ docker ps -a

「よし、起動してるものなくなった!」

「じゃあ、もう一度起動するか」

$ docker-sync-stack start

これを実行して、、、

Aくん
「ちょっと待ちなさい!!!」

Bくん
「え?なに?」

Aくん
「ビルドする前の状態にしてないからして!!」

Bくん

$ docker-sync-stack clean

「これか...」

Aくん
「そうそう。そのあとに起動する前にビルドしてね!」

Bくん
「なるほど・・・」

$ docker-compose build

「これをして、、、」

$ docker-sync-stack start

これをしてと・・・・

... コンテナを立ち上げ中 ...

app_1  | [2020-05-01 09:01:23] INFO  WEBrick::HTTPServer#start: pid=1 port=3001

「お!!エラーがなくなって起動できた!!!!わーい!!!」

Aくん
「やったね!おめでとう!!」

ここで、Docker起動までの物語は終わりです。

今回の件で学んだこと

  • エラー内容を読む
  • エラー内容を理解する
  • ググる
  • トライアンドエラーを繰り返す

当たり前ではあるけど、こうやって、今ある問題や課題を解決していくしかないと感じました。
もちろんすでに実体験のある人やノウハウがある人に聞けば一発で解決すると思いますが、
その問題が他で起きていない場合や、ググってもなかなか見つからない場合などはトライアンドエラーを繰り返して解決に近づいていくしかないなと感じました。

解決方法

今回の場合
GemfileとGemfile.lockが更新された際にGemfileだけgithubで記載されている状態になっていたので、
それをhttpsにしてあげることで解決しました。

Dockerが起動できていた時の状態

Gemfilel

gem 'carrierwave', github: 'carrierwaveuploader/carrierwave'

Gemfilel.lock

GIT
  remote: git://github.com/carrierwaveuploader/carrierwave.git

Dockerが起動できなくなった時の状態

Gemfilel

gem 'carrierwave', github: 'carrierwaveuploader/carrierwave', tag: 'v1.2.2'

Gemfilel.lock

GIT
  remote: https://github.com/carrierwaveuploader/carrierwave.git

Dockerが起動できるように修正した状態

Gemfilel

gem 'carrierwave', :git => 'https://github.com/carrierwaveuploader/carrierwave.git', tag: 'v1.2.2'

Gemfilel.lock

GIT
  remote: https://github.com/carrierwaveuploader/carrierwave.git

今回の解決方法

Gemfilelの修正

修正前

gem 'carrierwave', github: 'carrierwaveuploader/carrierwave', tag: 'v1.2.2'

修正版

gem 'carrierwave', :git => 'https://github.com/carrierwaveuploader/carrierwave.git', tag: 'v1.2.2'

修正後はdockerを再起動して、ビルドし直して起動してみる

# 完全に元の状況に戻す(ビルドする前の状態)
$ docker-sync-stack clean

# コンテナを停止する
$ docker-compose down

# 停止中のコンテナなど全て綺麗にする
$ docker system prune

# コンテナの確認(空であることを確認)
$ docker ps -a

# ビルドを実行
$ docker-compose build

# ファイル同期してコンテナを立ち上げる
$ docker-sync-stack start