ubuntu特有の問題。
以下の英語の記事に答えが載っているが、備忘録としてめも。
https://www.fullstaq.com/knowledge-hub/blogs/docker-and-the-host-filesystem-owner-matching-problem
自分が遭遇したパターンは他人からもらったlaravel×vueプロジェクトからコンテナを生成後、起動を行いローカルのエディタでファイルを編集したものの、コンテナ内の同名ファイルに変更が反映されず、またローカルで作成したファイルがコンテナ内に存在しないというもの。
つまりホストマシン内のプロジェクトフォルダとコンテナ内のプロジェクトフォルダが紐付いていない状態。
原因はコンテナ内でのディレクトリの所有者とホストマシン上にあるディレクトリの所有者が異なるため。
uidは同一でなければならない。
まずはフォルダとファイルの所有権を確認。
ホストマシン上にあるフォルダの所有者はuidが1000のログインユーザのはず。
一方コンテナ内のフォルダの所有者を確認してみるとrootユーザになっていることが確認できる。
そのためファイルを変更するたびにrootパスワードが求められた。
以下解決策。
dockerfileの末尾に以下を追記。
ARG UID=1000
ARG GID=1000
RUN groupadd -g ${GID} docker
RUN useradd -u ${UID} -g ${GID} -s /bin/bash -m docker
USER ${UID}
dockerfileを変更したらもう一度イメージを再構築するために以下のコマンドを打つ必要がある。
$ docker-compose build --no-cache
もしくは(docker compose build --no-cache)
イメージ再構築後、コンテナ内に入りディレクトリを確認すると所有者が1000になっていると思われる。