【Docker】-v バインドマウントでエラーが出る時の原因 no.16

![パンプキン カフェ (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/2f443bc8-580a-f4fb-fbf6-759ba9073127.png)


こんにちは、まゆみです。

Dockerについての記事をシリーズで書いています。

前回・前々回の記事で、『-vオプション』についての記事を書いてきました。

ただ、-vオプションの記事を読みながらコマンドをうっているはずなのに、上手くいかない場合もあると思います。

今回の記事では、<font color="Red">-v オプションを使って、バインドマウントをした途端うまく行かなかった時にエラー</font>として最も考えられそうなことを書いていこうと思います。

では早速はじめて行きますね。


#『-v』バインドマウントでエラーが出てしまう時に考えられるエラー

![『-v』でバインドマウントするまではうまく行っていたのに。。。.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/c06f919b-3e84-6d73-9d49-e7257c8d022d.png)


##local側に必要なdependencyがない。

順調にうまく進んでいたのに、『-v』オプションを付けて実行した瞬間上手くいかなくなった人は、まず、<font color="Red">ローカルホスト側に『node_modules』など、ソースコードに必要なモジュールがあるかどうか</font>確かめてください。(モジュールがある人は、今回の記事の内容には、あなたの求めている情報は書かれていないと思います。<(_ _)>)

![2021-06-20_10-03-17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/127b16ad-7ef2-5e27-44b9-58df94fdf38b.png)


node.jsを使って何かアプリを作る時、必要なdependenciesは『package.json』に書かれていますよね。(下記のスクショ参考)

![2021-06-20_10-51-28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/75e01e1c-df96-764e-8a5a-4084e7d6eb25.png)

localホスト側に、必要なdependenciesがないと、上手く実行されない原因になります


##localホスト側にnode_modulesが無いのがどうして原因なの？

Dockerfile で『RUN npm install』でインストールしてイメージを作っているのに、なぜ、localホストにnode_modulesがないといけないの？？


そんな疑問がわいてくるかも知れません。

一言でその答えを書くと<font color="Red">『-v バインドマウント』で、DockerfileでCOPY した内容が全て上書きされる</font>からです。



![2021-06-20_10-31-50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/6f84dd69-1e42-6b2f-e4dd-74501a1be937.png)

ですが、その後

```
-v <マウントさせたいフォルダー> : <Container側のフォルダー>
```

build context全体をマウントさせると、先ほどDockerfileでCOPY したファイルを全て上書きするような形になってしまうのです。

ちょうど下記のイラストのような状況になります

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/1b2f14ac-6988-5484-2064-b1ceb994ae3e.png)


そうすると、localホスト側に『node_modules』がないのが、エラーの原因になってしまいます。


#解決方法

![Host (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/df9506ae-56da-bd2d-ff06-16a5d973c91d.png)


上記のことが原因で『-v』でマウントした瞬間上手くいかなくなった場合、

>Anonymous Volume を使う

と解決する事ができます。


##Anonymous Volumeって何？

Anonymous Volumeは[前回の記事](![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/1b2f14ac-6988-5484-2064-b1ceb994ae3e.png)
)で、Named Volumeと比較しながら軽く説明させていただいていました。

>Named (名前の付けられた)
Anonymous (匿名の)

という言葉が示している通り、Anonymous Volumeは

>そのContainerに付属して作られた

>他のContainerとは共有のできないVolume

になります

今回の記事で取り上げているような原因でバインドマウントがうまく行かなくなった時、Anonymous Volumeを使って解決します。


具体的なコマンドを示します。


下記のコマンドになります。


```
-v /app/node_modules
```
Named Volumeでは、：(コロン)をはさんで、ホスト側のディレクトリとContainer側のディレクトリーを指定しました。

```
-v <ホスト側> :　<container側>
```

『Container側のディレクトリーから、ホスト側のディレクトリ―を参照してくれ』ということですね。

ただ、<font color="Red">Anonymous Volumeは：(コロン)を書かず、Container側のディレクトリ―のみ指定</font>します。

Anonymous Volumeを使うと『Containerの外の物を参照するな。Container側の指定されたディレクトリーをそのままプレイスフォルダーとして使ってくれ』という意味になります。



![2021-06-20_11-33-56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/c9bb9c35-e772-95a7-e3b1-1335e84d7373.png)

上記のスクショのようにコマンドを実行しました。


そしてlocalホスト側を見ると『node_modules』があるように表示されています

![2021-06-20_11-36-38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/cf92e0c4-8010-9c49-d122-d5b404b5a0c1.png)

#まとめ

今回の記事はここで締めくくらせていただきます。

『-v』は理解に苦しんだところなのですが、1週間かけて、理解する事ができました。

少しでもこの記事が役に立てれば幸いです。