docker-in-dockerでボリュームがマウントされない (bindされない)

# はじめに

[15Stepで習得 Dockerから入るKubernetes コンテナ開発からK8s本番運用まで](https://amzn.to/2V0mLdF)という本を勉強するために、docker-in-docker(dind)でLinux Alpineの上にUbuntuのコンテナを作成して、Kubernetesをインストールして使えるようにしました。

そのあと、AlpineコンテナにあるシェルスクリプトをUbuntuコンテナにbindしようとしました。
しかし、何故か共有できません。かなり調べたのですが解決方法が見当たらず。
また、`Teratail`で[質問](https://teratail.com/questions/356680)したところ、詳しい方が同じ環境でちゃんとマウントできたよというコメントがきました。

しかし、会社の方や別のパソコンでも試しましたが、やはり共有できなかったのでまとめたいと思います。
根本的解決はできませんでしたが、共有できるように設定することは可能でした。


# 環境
- Docker Desktop for Windows
- Ubuntu 18.04

# 問題

ここでは、マウントができないことを再現するため以下のよう環境を用意しました。

`ディレクトリ構成`

```
root/
┣ Dockerfile (Ubuntu)
┣ docker-compose.yml (Ubuntu)
┣ vm
  ┣ Dockerfile (Python)
  ┣ docker-compose.yml (Python)
  ┣ opt
    ┣  test.txt
```

`Dockerfile`(Ubuntu)

```Dockerfile
FROM docker:20.10 as docker
FROM ubuntu:20.04

RUN apt-get -y update && \
		apt-get -y upgrade

RUN apt-get install -y \
		docker-compose

# ホストのdocker daemon共有
COPY --from=docker /usr/local/bin/docker /usr/local/bin/
```

`docker-compose.yml`(Ubuntu)

```docker-compose.yml
 version: '3'
version: '3'
services:
  alpine:
    restart: always
    build: .
    container_name: 'ubuntu'
    tty: true  
    working_dir: '/work'
    volumes:
      - ./vm:/work/
      - /var/run/docker.sock:/var/run/docker.sock
```

`Dockerfile`(Python)

```Dockerfile
FROM python:3
RUN apt-get update

RUN apt-get install -y vim 
RUN pip install --upgrade pip
```

`docker-compose.yml`(Python)

```docker-compose.yml
version: '3'
services:
  python3:
    restart: always
    build: .
    container_name: 'python3'
    working_dir: '/work'
    privileged: true
    tty: true
    volumes:
      - ./opt/:/work/
```

`test.txt`

```test.txt
hello world
```

UbuntuコンテナはDocker Desktopのソケットを共有してDockerを利用しています。

そのあと、Python3コンテナに入り、`test.txt`があるか確認します。


まずUbuntuコンテナに入ります。

```
$ docker-compose up -d
$ docker exec -it ubuntu bash
```

そのあと、docker-in-dockerでPythonコンテナを立ち上げます。

```
$ docker-compose up -d
$ docker exec -it python3 bash
$ ls # test.txtがない
```

なぜか共有ができていません。

Dockerfileに以下の行を追加します。

```Dockerfile
COPY ./opt ./
```

するとファイルはコピーすることはできました。なぜかマウントだけできません。

また、以下のようにボリュームの設定を変えると

```docker-compose.yml
    volumes:
      - ./:/root/opt

```

```
$ ls # optディレクトリが存在
$ cd opt
$ ls # test.txtはない
```

なぜかファイルだけがマウントできないことがわかります。

# 解決方法

Python3コンテナのボリュームを以下のように変更することで、動くようになりました。

```docker-compose.yml
    volumes:
      - /c/Users/jinwa/Desktop/test/vm/opt/:/work/
```

Ubuntuのマウントするディレクトリを絶対パスで指定しました。
すると、test.txtの存在が確認できました。

ちなみに、Ubuntuのデスクトップまでのパスは人によっては`/mnt/c/`にあることがあります。
以下の手順で変更してみて下さい。

[WSLからDocker Desktop for Windowsを使う](https://kawadev.net/wsl-docker-desktop/)

コンテナ内でボリュームに指定した`./opt`でUbuntuコンテナの`./opt`を探しているのではなく、ホスト側(Ubuntu)の`./opt`を見つけようとしている気がします。

また、以下の方法がベストかなと思いました。

まず、Ubuntuコンテナのoptディレクトリに`.env`を追加します。
そして、vmディレクトリに対応するところまでの絶対パスを環境変数で設定します。

`.env`

```.env
PWD_PATH=/c/Users/jinwa/Desktop/test/vm
```

そして、docker-compose.ymlを修正します。

```docker-compose.yml
    volumes:
      - ${PWD_PATH}/opt/:/work/
```

これで、同じようにマウントすることができます。
`Git`にPushするときは`.env`をPushしないように`.gitignore`に追加しましょう。

また、.envは人によって内容が違うため`README`にその旨と環境変数の設定について記載しましょう。

# おわりに

これは気づいてからかなり沼りました。
ですが、ネットにはほぼ記事がなく不思議でした。dindあまりする人がいないのかもしれないですが、、
会社の先輩にアドバイスをもらい試行錯誤して動かせるようにはなってよかったです。

# 参考
- [WSLからDocker Desktop for Windowsを使う](https://kawadev.net/wsl-docker-desktop/)