【Docker】schema.rbがない、作っても中身がない、から解決へ


はじめに

Rails(API) ✕ Dockerの環境で開発を進めていく中で、テーブルの構造を確認する為、schema.rbを確認するも、存在しなかった。
原因がわからず、途方に暮れたがなんとか解決できたので、まとめておく。

schema.rbが作成されるタイミング

rails db:migrateしたタイミングで、通常であれば
db/schema.rbとDBディレクトリ直下に作成される。

「schema.rb 無い」で検索して発見した、
【おまけ】rails db:schema:dump で db/schema.rb 作成

こちらの記事を参考にさせて頂いて、
rails db:schema:dumpを行うも、自分の環境で作成されたのは、中身が空っぽの`schema.rb"だった。

Dockerコンテナ内でファイルの有無の確認

docker-compose run api bashでDockerコンテナ内に入り、
cd db でDBディレクトリに移動し、ls とすると、

migrate  schema.rb  seeds.rb

あった。。

なぜVScode上ではないのか、と思い再起動するもやっぱりない。

原因・解決

docker-compose.ymlのvolumesの書き方を間違えていた。

docker-compose.yml
volumes:
      - .:/my_app

- .:/appとすべき所を、

- ./appとしていた為、ローカルのホスト機とDockerコンテナの変更が同期されていない状態だった。

volumesの書き方について

.(ピリオド)がdocker-composeを行ったカレントディレクトリ示し、:(コロン)を挟んだ右側に、Dockerコンテナ内でのパスを書くことで、同期される。

[ホスト機のパス]: [Dockerコンテナ内でのパス]
という形にすることで、ローカルのプロジェクトディレクトリをアタッチ、Dockerのコンテナが起動(docker-compose)する際にカレントを見る=ローカルのプロジェクトディレクトリを見るという設定を行うことができる。

逆に、:(コロン)をつけずに、

    volumes:
      - /home/vagrant/opt/mysql:/var/lib/mysql

などの形にすると
ホスト機のディレクトリでは無く、Dockerの中でvolume領域を作って、それをアタッチする形になり、ローカルのホスト機とDockerコンテナの変更は同期されない。

終わりに。

最後まで読んで頂きありがとうございます
転職の為、未経験の状態からRailsを学習しております。正しい知識を着実に身に着け、実力のあるエンジニアになりたいと考えています。継続して投稿していく中で、その為のインプットも必然的に増え、成長に繋がるかと考えています。
今現在、初心者だからといって言い訳はできないですが、投稿の内容に間違っているところや、付け加えるべきところが多々あるかと思いますので、ご指摘頂けると幸いです。この記事を読んで下さりありがとうございました。