Less is Best

rubyが好き。技術の話とスタートアップに興味があります。

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で作り直します。