今回は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して作り直せば反映されるのですが、それだと面倒ですよね。
ちなみにdocker-compose.ymlのvolumesの- . : app_name
の意味ですが、カレントディレクトリの内容をコンテナのapp_nameディレクトリに反映させると言う意味です。
ここでいうカレントディレクトリは、docker-composeコマンドを記述するディレクトリを指します。
つまりもしDockerfileで作成しているディレクトリ名がdocker-compose.ymlで記載しているディレクトリ名と違うと、うまく反映(マウント)できなくなってしまいます。
と言うことでした!うまく伝わりましたかね?わからないことがあれば、ご連絡ください!
しばらくはまりました。。。