【Rails, Docker, Postgres】ソースコードの変更がDockerコンテナに即時反映されない

今回はdockerコンテナでの変更がvscodeやAtomといったエディタ上に即時反映されないと言う状況を扱います。

逆にvscodeなどのエディタ上での変更が即時dockerコンテナに反映されないと言う場合も対象です。それでは原因と対処法についてまとめておきたいと思います。

【Rails, Docker, Postgres】ソースコードの変更がDockerコンテナに反映されない

結論

docker-compose.ymlのvolumesに指定されているディレクトリが、Dockerfileで作成した作業ディレクトリ名と異なっているのが原因です。(私の場合の原因はこれでした。)

なので、docker-compose.ymlのvolumesに指定したディレクトリの名前と、Dockerfileで作成している作業ディレクトリの名前を確認してください。

詳細

私のはまった事例です。

docker-compose.yml

コード
version: '3'
services:
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: root
    ports:
      - "3306:3306"

  web:
    build: .
    command: rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/app_name ※ここの記述がポイント
    ports:
      - "3000:3000"
    links:
      - db

dockerfile

コード
FROM ruby:2.5.3

# 必要なパッケージのインストール(基本的に必要になってくるものだと思うので削らないこと)
RUN apt-get update -qq && \
    apt-get install -y build-essential \ 
                       libpq-dev \        
                       nodejs           

# 作業ディレクトリの作成、設定
RUN mkdir /app_name ※ここで作成した作業ディレクトリ名がポイント
##作業ディレクトリ名をAPP_ROOTに割り当てて、以下$APP_ROOTで参照
ENV APP_ROOT /app_name 
WORKDIR $APP_ROOT

# ホスト側(ローカル)のGemfileを追加する(ローカルのGemfileは【3】で作成)
ADD ./Gemfile $APP_ROOT/Gemfile
ADD ./Gemfile.lock $APP_ROOT/Gemfile.lock

# Gemfileのbundle install
RUN bundle install
ADD . $APP_ROOT

結論から言うと、docker-compose.ymlのvolumesに記載しているディレクトリ名と、Dockerfileの作業用ディレクトリ名が違っていると、ソースコードを即時反映できません。

docker-compose buildして作り直せば反映されるのですが、それだと面倒ですよね。

MEMO

ちなみにdocker-compose.ymlのvolumesの- . : app_nameの意味ですが、カレントディレクトリの内容をコンテナのapp_nameディレクトリに反映させると言う意味です。

ここでいうカレントディレクトリは、docker-composeコマンドを記述するディレクトリを指します。

つまりもしDockerfileで作成しているディレクトリ名がdocker-compose.ymlで記載しているディレクトリ名と違うと、うまく反映(マウント)できなくなってしまいます。

と言うことでした!うまく伝わりましたかね?わからないことがあれば、ご連絡ください!

しばらくはまりました。。。

Leave a Reply

Your email address will not be published.

CAPTCHA