Data Volume と Data Volume Containerでハマったこと

### 事の原因
***

AOSPのmirrorを入れた Data Volume Container を作ろうとしてDockerfileをビルドしたらうまくいかなかった

```lang:Dockerfile
FROM ubuntu:14.04

RUN apt-get update \
 && apt-get install -y curl git python \
 && rm -rf /var/lib/apt/lists/* /var/cache/apt/archives/*
RUN curl https://storage.googleapis.com/git-repo-downloads/repo > /bin/repo \
 && chmod a+x /bin/repo
VOLUME /usr/local/src/android/mirror
WORKDIR /usr/local/src/android/mirror
git config --global user.email "hoge@hoge.com" && git config --global user.name "hoge" && git config --global color.ui autRUN repo init -u https://android.googlesource.com/mirror/manifest --mirror \
 && repo sync
```

こんな感じのDockerfile をビルドして中を確認したら

```
# docker build -t aosp/mirror .
# docker run --rm -it aosp/mirror ls -a /usr/local/src/android/mirror
. ..
```

ダウンロードしたディレクトリが空で数時間かけてダウンロードしたソースが行方不明に

### いろいろやった結果
***

まず簡単なDockerfileで再現することを確認

```lang:Dockerfile
FROM ubuntu:14.04
VOLUME /usr/local/src/android/mirror/
RUN mkdir -p /usr/local/src/android/mirror/ \
 && echo "test data" > /usr/local/src/android/mirror/test1.txt
```

```
# docker build -t test1 .
# docker run --rm -it test1 find /usr/local/src/android/mirror/
/usr/local/src/android/mirror
```

aospの時と同じようにファイルが無い
次は順番を変えてみる

```lang:Dockerfile
FROM ubuntu:14.04
RUN mkdir -p /usr/local/src/android/mirror/ && echo "test_data" > /usr/local/src/android/mirror/test2.txt
VOLUME /usr/local/src/android/mirror/
```

```
# docker build -t test2 .
# docker run --rm -it test2 find /usr/local/src/android/mirror/
/usr/local/src/android/mirror
/usr/local/src/android/mirror/test2.txt
```
これはOKだった
`VOLUME` 表記は最後に書いたらうまくいった
ふと`VOLUME`書いた時点のディレクトリの内容になるような気がしたので

```lang:Dockerfile
FROM ubuntu:14.04
RUN mkdir -p /usr/local/src/android/mirror/ && echo "test_data" > /usr/local/src/android/mirror/test3.txt
VOLUME /usr/local/src/android/mirror/
RUN echo "test" > /usr/local/src/android/mirror/test4.txt
```

```
# docker build -t test2 .
# docker run --rm -it test2 find /usr/local/src/android/mirror/
/usr/local/src/android/mirror
/usr/local/src/android/mirror/test3.txt
```
と `VOLUME`書いた後のファイルはなかった事になっていた

**VOLUMEは最後の方に書け**ということか


### Volume を使う方
***

`volumes-from` は複数指定できるのでその時の挙動を見てみる

* 同じディレクトリに入れる

CONTAINER1では -v /usr/local/src/android/mirror
CONTAINER2では -v /usr/local/src/android/master
CONTAINER3では -v /usr/local/src/android/gingerbread
とあった場合は

```
docker run -it --rm --volumes-from CONTAINER1 --volumes-from CONTAINER2 --volumes-from CONTAINER3 find -maxdepth 1 /usr/local/src/android
/usr/local/src/android
/usr/local/src/android/gingerbread
/usr/local/src/android/master
/usr/local/src/android/mirror
```

ととりあえず全部見えてる

* ディレクトリが親子の場合

CONTAINER1では -v /usr/local/src/android/mirror
CONTAINER2では -v /usr/local/src/android/
CONTAINER2には /usr/local/src/android/test.txt を置いておく

```
docker run -it --rm --volumes-from CONTAINER1 --volumes-from CONTAINER2 find -maxdepth 1 /usr/local/src/android
/usr/local/src/android
/usr/local/src/android/test.txt
```

`/usr/local/src/android/mirror` がいない
`mount` だったら CONTAINER2 をマウントする時に空じゃないってエラーになるけど何も言わずマウントし直してる様な挙動になってる

順番を変えてみる

```
docker run -it --rm --volumes-from CONTAINER2 --volumes-from CONTAINER1 find -maxdepth 1 /usr/local/src/android
/usr/local/src/android
/usr/local/src/android/mirror
/usr/local/src/android/test.txt
```

ちゃんと見える

**ルートに近いディレクトリから volumes-from に書け**ということ

両方ともちゃんと考えればその通りな挙動ではあるしドキュメント見てないので書いてあるといわれると何も言えないんだけど数時間無駄にしたんで残しておく