事の原因
AOSPのmirrorを入れた Data Volume Container を作ろうとして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で再現することを確認
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の時と同じようにファイルが無い
次は順番を変えてみる
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
書いた時点のディレクトリの内容になるような気がしたので
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 に書けということ
両方ともちゃんと考えればその通りな挙動ではあるしドキュメント見てないので書いてあるといわれると何も言えないんだけど数時間無駄にしたんで残しておく