DockerのVOLUMEを調べてみた。
DockerのVOLUMEの挙動がよくわからなくてはまっていたので、色々とテストしてみました。 VOLUMEがどんなもんなんだろというのが理解できたような、変更入りそうな感じだなーと思いつつテストしてみました。
テスト1
VOLUMEはビルド時に影響をあたえているのか!?
FROM base MAINTAINER yoshiso VOLUME ["/data"] RUN mkdir /data RUN echo "test" >> /data/test.txt CMD ["/bin/bash"]
結果、
mkdir: cannot create directory `/data': File exists
というエラーがビルドの段階で発生。VOLUMEを定義した段階でディレクトリが生成されるようではあります。
テスト2
ビルドする際に、VOLUMEディレクトリにファイルは追加できるのか!?
FROM base MAINTAINER yoshiso VOLUME ["/data"] RUN touch /data/text.txt CMD ["/bin/bash"]
テスト1の結果を踏まえるのであれば、RUN時にいろいろと追加出来るのか??と考え、実行時にファイルをVOLUMEに追加できるかチェック
$ docker run -t -i yoshiso/testv root@c99e6b8aa6db:/# ls -la data total 8 drwx------ 2 root root 4096 Jan 7 14:38 . drwxr-xr-x 41 root root 4096 Jan 7 14:38 ..
結果、あれあれ出来ていないですね。。。
Hostのディレクトリをマウントすると… directoryのownerが1000になる。(!?!?)しかも追加はできていない。
$ docker run -t -i -v `pwd`/data:/data yoshiso/testv root@045fcbe6b95a:/# ls -la /data total 4 drwxr-xr-x 1 1000 1000 68 Jan 7 15:17 . drwxr-xr-x 41 root root 4096 Jan 7 15:46 .. root@045fcbe6b95a:/# useradd yoshiso root@045fcbe6b95a:/# chown yoshiso /data root@045fcbe6b95a:/# ls -la /data total 4 drwxr-xr-x 1 yoshiso yoshiso 68 Jan 7 15:17 . drwxr-xr-x 43 root root 4096 Jan 7 15:46 ..
これ、変更出来るのかと思って試してみたけど、owner変更できるみたい。 以前は、できなかったような気がしたのに。気の迷いだったのかな
root@045fcbe6b95a:/# su - yoshiso No directory, logging in with HOME=/ $ touch /data/sample.txt $ ls /data/sample.txt /data/sample.txt
ちなみに、新規作成ユーザーでしっかり書き込み出来ますね。
テスト3
FROM base MAINTAINER yoshiso VOLUME ["/data"] RUN useradd yoshiso RUN chown yoshiso /data CMD ["/bin/bash"]
今度は、/data
の所有者をbuildの段階で変更できるのかテスト
$ docker run -t -i yoshiso/testv root@9276f2da06bd:/# ls -la /data total 8 drwx------ 2 root root 4096 Jan 7 14:46 . drwxr-xr-x 45 root root 4096 Jan 7 14:46 ..
できていない。。。 どうやら権限を事前に変更するのは不可能なようですね。。。
root@9276f2da06bd:/# chown yoshiso /data root@9276f2da06bd:/# ls -la /data total 8 drwx------ 2 yoshiso root 4096 Jan 7 14:46 . drwxr-xr-x 45 root root 4096 Jan 7 14:46 ..
でも一度コンテナを起動させれば変更は可能なよう
今度は、ホストのディレクトリをマウントしてみます
$ docker run -t -i -v `pwd`/data:/data yoshiso/testv root@fa04e1e46e0a:/# ls -la data total 4 drwxr-xr-x 1 yoshiso yoshiso 68 Jan 7 14:51 . drwxr-xr-x 45 root root 4096 Jan 7 14:51 ..
!?!?!? あ、あれ。。。権限変更しっかりできちゃってるww この挙動はバグなんでしょうか、なんなんでしょうか?
とりあえず分かったことは、VOLUME回りは不安定な感じがマックスなので変更の可能性が大いにありそうだということ。 現状だと、テスト3の最後の形式で使用すれば、ビルド時点で所有者を指定することが可能であることが分かりました。 ==>これで、Mysqlの永続化が出来そうな気がします。変更はいる可能性もありそうですけど。。
追記 1/08 1:27
baseにcentosを使った場合、挙動が異なることを確認しました。これははまるので要注意。
Dockefile
FROM centos MAINTAINER yoshiso VOLUME ["/data"] RUN touch /data/text.txt CMD ["/bin/bash"]
result
$ docker run -i -t -v `pwd`/data:/data yoshiso/test3 bash-4.1# ls -la data/ total 4 drwxr-xr-x 1 1000 1000 68 Jan 7 11:22 . drwxr-xr-x 35 root root 4096 Jan 7 11:21 .. bash-4.1# chown root /data bash-4.1# ls -la data/ total 4 drwxr-xr-x 1 1000 1000 68 Jan 7 11:22 . drwxr-xr-x 35 root root 4096 Jan 7 11:21 ..
このように、baseを使用した時と違ってホストからマウントすると、ディレクトリの所有者が全く変更出来なくなります。 これのせいでmysqlサーバー作るの詰んでた。 ubuntsuで作り直します。