2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Mac上のDockerコンテナでファイル同期が効かない時の対策

Last updated at Posted at 2020-07-19

TL;TR

Docer for MacでLinuxなどケース・センシティブなOSをベースにしたコンテナとホストのMacの間でファイル同期をしていると発生するようだ。

解決策としてはMac上にケース・センシティブなボリュームを作成し、それをMacにマウントし、それをコンテナにマウントする。

下記2コマンドで、「あっ」という間にMac上にケース・センシティブなボリュームを作成できる。

hdiutil create -type SPARSE -fs hfsx -size 4g -volname linux linux.hfsx.dmg.sparseimage
hdiutil attach -nobrowse -mountpoint linux linux.hfsx.dmg.sparseimage

背景と問題

エンジニアチーム内や本番・テストなど異なる環境でも、OSやミドルウェアやそれらのバージョンなどを極力同じにするという目的で、うちではDockerコンテナでMac上にローカル開発環境を構築している。新しいメンバーが入っても、コンテナを起動するだけで開発環境の構築ができる。

Mac上のソースコードがあるディレクトリをDockerコンテナ内のWebサーバのドキュメントルートにマウントすれば、ローカルで編集したものがすぐにローカルWebサーバに反映される。・・・はずだったのだが、まぁまぁ頻繁に変更が反映されないことがある。
コンテナをrestartすると反映されるので、発生した場合はそうしていたが、いい加減効率が悪いので直したかった。

変更が反映されていないときにコンテナ内でのファイルを確認すると、変更は反映されている。しかし、ブラウザで見ると反映されていない。

そして、たまたまエラーになっていた時にそのファイル名を見ると、FooBar.php であるはずのファイル名が foobar.php とログには出ている。しかし、コンテナ内をlsコマンドで確認するとFooBar.phpはあってもfoobar.phpは無い。

試しにfoobar.phpをvimで開くと、なんと開けるうえに内容が古いものになっている。そして、FooBar.phpを開くと新しいものになっている。
しかし、やはりfoobar.phpはlsでは出てこない。

原因

コンテナがベースにしているOSがケース・センシティブだが、コンテナ内で使用しているファイルシステム自体はMacのを継承してケース・インセンシティブなのが問題なようだ。コンテナ内のOSはファイル名の大文字小文字を区別する前提で動いているが、使用しているファイルシステムは大文字小文字を区別しない、ということで、Macとコンテナの間でファイルを同期する際にどこかで不整合が発生しているらしい。

発生するときとしない時があったのは、全て小文字のファイル名だと問題にならなかったということだ。

解決策

ケース・センシティブなボリュームを作成する

参考:https://github.com/docker/for-mac/issues/320#issuecomment-315324629

Mac上にケース・センシティブなボリュームを作成し、それをMacにマウントし、それをコンテナにマウントする。

まず、ケース・センシティブなボリュームを作成する。パーティションサイズを変えたりフォーマットしたりと面倒なことは一切ない。下記コマンドで一瞬で4GBのケース・センシティブなボリュームが作成できる。

hdiutil create -type SPARSE -fs hfsx -size 4g -volname linux linux.hfsx.dmg.sparseimage

そしてこれを下記コマンドでMacにマウントして使えるようにする。マウントする場所は -mountpoint で指定している。

hdiutil attach -nobrowse -mountpoint /Users/hoge/linux linux.hfsx.dmg.sparseimage

マウントしたら普通のディレクトリと同じように使用できる。

Screen_Shot_2020-07-19_at_11_04_45.png

ここをコンテナのvolumeとしてマウントすれば、コンテナ内のケース・センシティビティと一致して問題が発生しないはず。
例えばdocker-composeならばこんな感じに。

services:
  ctober-web-server:
    ...
    volumes:
      - /Users/hoge/linux:/var/www/html:cached

不要になったら

このボリュームが不要になったら下記でunmountできる。

hdiutil eject linux

また、Macを再起動したらまたマウントする必要がある。その時は上記の hdiutil attach コマンドを実行すれば良い。

ボリュームのサイズを変更する

ディスクイメージの作成後にサイズを大きくしたい場合など、 hdiutil resize を使用してサイズを変更できる。(自分の場合は、実行は一瞬でなんの画面表示もなかったがボリュームサイズを見てみると変更されていた。)

hdiutil resize -size 8G linux.hfsx.dmg.sparseimage

IDEでの警告

JetBrainsのPhpStormなど使用していると、作成したケース・センシティブなボリュームにあるファイルを編集すると、IDEが認識しているケース・センシティビティとファイルシステムのが違うよ、と警告が表示される。
そんなときは、Help -> Edit Custom Properties でファイルに下記を追加する。

idea.case.sensitive.fs=true

そして、IDEをリスタートすれば適用される。
参考:https://confluence.jetbrains.com/display/IDEADEV/Filesystem+Case-Sensitivity+Mismatch

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?