概要
コンテナA(参照される側)で共有したいディレクトリを、コンテナB(参照する側)でマウントして参照する。
簡単なやり方の説明としては、
- 参照される側はDockerfile内で
VOLUME
を指定。 - 参照する側は
docker run
する際に--volumes-from
で参照される側のコンテナ名を指定する。
という感じ。
環境
$ uname -a
Linux ip-172-31-32-92 4.14.77-70.59.amzn1.x86_64 #1 SMP Mon Nov 12 22:02:45 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
$ docker --version
Docker version 18.06.1-ce, build e68fc7a215d7133c34aa18e3b72b4a21fd0c6136
実装
1.Dockerfile
Dockerfileを二つ用意する。
Dockerfile1が参照される側、Dockerfile2が参照する側。
Dockerfile1の方の VOLUME
に注目。
VOLUME
に指定されたディレクトリがそのままマウントした参照する側のコンテナに出る。
Dockerfile1
FROM alpine:latest
WORKDIR /tmp/docker_mount_test
RUN touch hogehoge && \
echo "this is hogehoge" > hogehoge
VOLUME /tmp/docker_mount_test
Dockerfile2
FROM alpine:latest
2.docker build
普通にビルドするだけ。
docker build -f Dockerfile1 . -t test1
docker build -f Dockerfile1 . -t test2
こんな感じになる。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test1 latest b9bcae402c92 9 minutes ago 5.53MB
test2 latest 5cb3aa00f899 3 days ago 5.53MB
alpine latest 5cb3aa00f899 3 days ago 5.53MB
3.docker run
下記の通り docker run
する。
test2のコンテナの起動オプションに --volumes-from
で参照される側のコンテナ名を指定する。
docker run -it --rm -d --name test1 test1
docker run -it --rm --volumes-from test1 --name test2 test2
test2の docker run
でコンテナ側のシェルが立ち上がるので、Dockerfile1で VOLUME
に指定したディレクトリ配下に生成したファイルを cat
する。
Dockerfile2のコンテナ内で実行する
$ cat /tmp/docker_mount_test/hogehoge
this is hogehoge
という感じで、Dockerfile2のイメージから生成したコンテナから、Dockerfile1のイメージから生成したコンテナの中身が見えるようになる。