LoginSignup
3
3

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-12-18

事の原因


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

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で再現することを確認

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の時と同じようにファイルが無い
次は順番を変えてみる

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書いた時点のディレクトリの内容になるような気がしたので

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 に書けということ

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

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3