docker volume と node_modules
docker-compose で 名前付きvolume の driver_opts を調整することで、コンテナ上でインストールした node_modules が、IDEやエディタ側からでも確認できるようにする。
名前付きボリュームのマウントされる先がプロジェクト配下の node_modules ディレクトリに設定されることで、結果的にIDEやエディタ側からでも確認できるようになる、という関係か。
https://matsuand.github.io/docs.docker.jp.onthefly/storage/volumes/#create-and-manage-volumes を見ると、通常は /var/lib/docker/volumes 配下などにボリュームのディレクトリが作成され、そこにボリュームの内容が保存される様子か。
MountPoint が ${projectPath}/node_modules になることで、結果的にIDEやエディタから見える位置にボリュームに保存された内容が来る。
docker-compose 経由でボリュームを作成するとき、デフォルトで使用されるdriverは環境固有の模様。
docker v1.11 では local がデフォルトだったらしい。
local ドライバーは、linuxマシン上では mount コマンドと同等のオプションを受け取る模様。一方で、Windowsマシン上ではオプションを受け付けないらしい(「受け付けない」が、単に無視するだけなのか、composeコマンド実行時にエラーになるのか、Windowsマシンが無いので未確認)
The built-in local driver on Windows does not support any options.
The built-in local driver on Linux accepts options similar to the linux mount command. You can provide multiple options by passing the --opt flag multiple times. Some mount options (such as the o option) can take a comma-separated list of options. Complete list of available mount options can be found here.
docker compose の volume で driver_opts の設定でホストマシン上におけるvolumeの保存先を変更し、IDEやエディタからも確認できるようにするには、以下の前提が必要となるか
- ホストマシンがWindowsではないこと
- ホストマシン上でボリュームを作成する時に、 local がデフォルトで使われるプラットフォームであること
- 最も、これは driver に
localを明示的に指定すれば済む話ではある
- 最も、これは driver に
- ボリュームのドライバとして
localが利用可能なプラットフォームであること- 利用できない場合、compose は必ずエラーを起こすことになっている
- https://docs.docker.jp/compose/compose-file/index.html#compose-spec-volumes-driver
type: none について
moundコマンドでの位置づけ
mountコマンド の -t, --types オプションに対応しそうか。であれば、これはマウントするファイルシステムとして "none" を指定したのに等しいことになる
filesystem = "none" について
マウント対象が、物理デバイスによって分離されていないことを意味するものらしい。
Usually you mount filesystems which are located on a block device = hard disk, USB stick, ...
Additionally there are some "virtual" file systems such as /proc or /sys which are for interaction with Linux kernel. These do not have any block device associated with them => none is displayed instead.
proc等の物理的なデバイスに対応されないファイルシステムの場合、noneと表示されるのらしい
The none just means that there is no physical disk partition linked to the mount point you see when issuing the mount command. It is used for virtual filesystems like shm, ramfs, proc and tmpfs.
今回のケース = dockerが管理するvolumeを ${projectPath}/node_modules へマウントするという使い方であれば、確かにマウントは物理デバイスに対してではなく仮想的に行われる(という記述は正確か?)ので、 `filesystem = "none" という指定は、 https://stackoverflow.com/questions/59836742/docker-driver-opts-type-none でも書かれているように妥当と言えそうか。
Which makes sense to use for local Docker volumes as well that are not associated with a specific partition.
device: について
mount コマンドの
mount [-fnrsvw] [-o options] device|mountpoint
または
mount [-fnrsvw] [-t fstype] [-o options] device mountpoint
における device あるいは mountpoint に対応?
そのように読むならば
type: none
device: ${PWD}/node_modules
という指定は、「ボリュームを、${PWD}/node_modules へ、物理デバイス経由ではなく仮想的なものとして、マウントする」という意味として理解できそうか。
o: bind について
mount コマンドの -o bind という指定に対応か。
mountコマンドの以下記述を並べて見るに、 -o, --options オプションは、マウント実行時に関連するオプションを同時に複数指定するために使うもののよう。ならば -o bind と --bind は同値とみなしても良さそうか。問題なければ、 -o bind という指定がどういう挙動をするかについては --bind の説明を見れば良い。
-o, --options opts
Use the specified mount options. The opts argument is a
comma-separated list. For example:mount LABEL=mydisk -o noatime,nodev,nosuid(...)
Since util-linux 2.27 mount permits changing the mount options by
passing the relevant options along with --bind. For example:mount -o bind,ro foo foo
--bind 機能について、 mountコマンドの説明は下記
Remount part of the file hierarchy somewhere else. The call is:
mount --bind olddir newdir
-o bind で利用しているケース
用途としては、同一ファイルシステム内部のあるディレクトリを別のディレクトリにマウントする、というような用途であり、今回のケース = dockerのvolumeを ${projectPath}/node_modules にリンクさせる、というような使い方にも合致する