Dockerアップデートでデータベース(DB)が使えなくなる罠について


どうも、三町哲平です。

前回書いたDocker3.0.0にアップデートしたら、なんか起動しなくなった件 - Qiitaで、

話は、脱線しましたが、2.5.系にダウングレードする事で今回の3.0.0でのエラーに関しては間違いなく解決されています。2.5.0(別のエラー発生)に関しては、機会があれば記事にしますが、たぶん正攻法の様なやり方をしていないので、日記みたいにな記事になりそうで、書くかどうか迷っています。

...と書きましたが、前回記事を投稿したのが2020/12/12で、本日が2020/12/31の大晦日。

だいぶ日数が空いてしまいましたが、上記のたぶん正攻法の様なやり方をしていないやり方についてご紹介。

正攻法ではないやり方とは?

1から環境構築以上!!!

はい、本当にそれだけです。大したことないですね...。

でもこれだけでは駄目なので、もっと深いところまで突っ込むとするならば、
Docker-composeで環境を再構築した後に、Railsアプリの内容(MVCモデルの内容等)を完全復元するために、途中まで制作していた旧Railsアプリ→新Railsアプリへの移行が必要だと思うのですが、
その際にコピペしたファイルは

  1. appディレクトリ全交換
  2. testディレクトリ全交換
  3. publicディレクトリ全交換
  4. dbディレクトリ全交換
  5. configディレクトリのdatebase.yml以外全交換

これでDBを一新して、同じRailsアプリの制作を行うことができました。

その他、アプリ名を変更の際は、
Railsのアプリ名を変更して、GitHubのリポジトリ名を変更するまで - Qiitaを参考にしながら行えば問題ないはずです。

私の場合は、アプリ名をillustrationsillustrationに微修正しましたので、アプリ名変更後、上記の1.〜5.を実行して復旧しました。

どういうエラーが出たのか?

再度になりますが、詳しくは前回の記事Docker3.0.0にアップデートしたら、なんか起動しなくなった件 - Qiitaを読んでほしいのですが、一部抜粋すると...

因みに私のDockerのバージョンは、
2.5.1→3.0.0(今回のエラー発生)→2.5.0(別のエラー発生)→3.0.1(2.5.0の時と同じエラーの為、対応中)
となっております。

...↑これの、2.5.0(別のエラー発生)→3.0.1(2.5.0の時と同じエラーの為、対応中)←この部分の別のエラーというのが、PG::ConnectionBadエラーになります。

ちなみにこの時は、環境再構築で対応したのですが、なんとその1週間後には、3.0.2という最新バージョンが出て、アップデートをするとまた、同じPG::ConnectionBadが発生してしまいました。

PG::ConnectionBadとは?

調べて見ると色々原因は出てきたのですが、要約するとpostgresqlへの接続が出来ませんよ!というエラーです。先程まで使用できていたpostgresqlがDockerをアップデートすることで使えなくなる。これは、困りますよね...

結論

Docker Preference(設定) > Experimental Features > Use gRPC Fuse for file sharing をオフる(デフォルトではONになっています)

結局これが答えなんですね。

これをすることで、データベースの接続が問題なくできて、PG::ConnectionBadが発生しません。

Use gRPC Fuse for file sharing って何なんだろう?と思って、Google翻訳で調べたのですが、
Use gRPC Fuse for file sharing → (日本語訳)実験的機能>ファイル共有にgRPCヒューズを使用

う〜ん...イマイチ分かりませんね。

私が探した中では、最近(2020/08)のDocker for Macのファイルアクセス遅い問題事情メモ - Qiita←コチラの記事が一番参考になったのですが、今回の件に直結する部分を抜粋の上、要約しますと

gRPC-FUSEというファイルシステムが新たに導入されて、デフォルトではON状態なので、場合によっては、設定で古いやつ(osxfs)に切り替えて使用する。

となります。
つまり、Use gRPC Fuse for file sharingをOFFにする使い方というのは、レガシーなやり方なんですね。いずれ変更する必要があるのかもしれませんが、それはまた後日ということで...。

さいごに

ここである一つの疑問が私の中で生まれました。

まずこの記事は私個人の備忘録として書いた記事なので、内容は非常に伝わりにくかったと思いますが、さらに何の話?となり兼ねない事が前提での追記として、

前回の記事Docker3.0.0にアップデートしたら、なんか起動しなくなった件 - Qiita

因みに私のDockerのバージョンは、
2.5.1→3.0.0(今回のエラー発生)→2.5.0(別のエラー発生)→3.0.1(2.5.0の時と同じエラーの為、対応中)
となっております。

から、2.5.0(別のエラー発生)の所、この時点で

エラー画面
Cannot start service ec-cube: Mounts denied
ERROR: Encountered errors while bringing up the project.

↑このエラーは消えましたが、


↑このPG::ConnectionBadエラーが発生したという意味で書いたのですが、

この時に念のため、

Use gRPC Fuse for file sharingは、OFFにしているつもりでした。
しかし、Use gRPC Fuse for file sharingをOFFにしていた場合、今回の理屈で行くと、Dockerのバージョンが、2.5.0の時点で、PG::ConnectionBadは発生しなかったはずです。

私は思ったのですが、「Use gRPC Fuse for file sharingは、OFFにしているつもりでした。」の時に


① Use gRPC Fuse for file sharingをOFFにする。
② Apply & Restartを押す。

この② Apply & Restartを押す。を忘れていただけなのでは、ないのでしょうか?

凄い初歩的なミスをしていました。