Dockerで上位ディレクトリにあるファイルやディレクトリをマウントするTips

概要

Dockerでなにかしらの理由でカレントディレクトリから上位ディレクトリにあるファイルやディレクトリをコンテナで使いたい場合のTipsです。
前提として、カレントディレクトリの配下にあるディレクトリやファイルに対しては、難しいことを考えなくてもvolumeマウントしたり、COPYでコピーすることは可能です。
今回は対象がカレントディレクトリより、上位のディレクトリを対象とする場合です。

ディレクトリの構成

下記のようなテスト用のディレクトリ構成と過程する。
src配下には一般的にアプリケーションのソースコードがあるとする。

$ tree -a
.
├── .github
│   └── config.yml
├── docker
│   └── Dockerfile
└── src
    └── index.html

条件

  • カレントディレクトリがdocker

docker run

Dockerfileではなくdocker runコマンドを使った場合のパターン。

srcディレクトリだけをマウントする

Dockerfileをdockerディレクトリ配下に配置して、dockercdする。
そこでdocker runコマンドでコンテナを起動する際に、アプリケーションのソースコードをマウントするには下記を実行する。

$ docker run -v ${PWD}/../src:/app --rm -ti debian ls -la /app
total 4
drwxr-xr-x 3 root root   96 Jun 10 12:40 .
drwxr-xr-x 1 root root 4096 Jun 10 12:47 ..
-rw-r--r-- 1 root root    0 Jun 10 12:40 index.html

リポジトリ全体をmountする

上位ディレクトリをマウントする際にpwdで上位ディレクトリを指定するだけでOK。

$ docker run -v ${PWD}/../:/app --rm -ti debian sh -c 'ls -la /app'
total 4
drwxr-xr-x 5 root root  160 Jun 10 12:46 .
drwxr-xr-x 1 root root 4096 Jun 10 12:58 ..
drwxr-xr-x 3 root root   96 Jun 10 12:41 .github
drwxr-xr-x 3 root root   96 Jun 10 12:46 docker
drwxr-xr-x 3 root root   96 Jun 10 12:40 src

特定のファイルと特定のディレクトリをmountする

上記と同じで、pwdを使ってVolumeマウントすることで、ファイルもディレクトリもマウントすることが可能。

$ docker run -v ${PWD}/../src:/app -v ${PWD}/../.github/config.yml:/app/config.yml --rm -ti debian sh -c 'ls -la /app'
total 8
drwxr-xr-x 4 root root  128 Jun 10 13:00 .
drwxr-xr-x 1 root root 4096 Jun 10 13:00 ..
-rw-r--r-- 1 root root    5 Jun 10 12:41 config.yml
-rw-r--r-- 1 root root    0 Jun 10 12:40 index.html

Dockerfile

基本的にはDockerfileで実施する場合は、今回の構成だとdockerディレクトリで実施するのではなく、その上位のディレクトリで下記のようにしてbuildするのが基本である。

$ ls -la
drwxr-xr-x - kazuma 10 6 21:41 .github
drwxr-xr-x - kazuma 11 6 01:23 docker
drwxr-xr-x - kazuma 10 6 22:00 src

$ docker build -t mounttest -f docker/Dockerfile .

ただし、もしdockerディレクトリ内で実行したい理由があった場合は、下記のように実行することでbuild時に上位ディレクトリのデータをコピーすることが可能である。

$ docker build -t mounttest -f Dockerfile ../