Docker ネタです。
今回紹介するツールを使うよりも良い方法があれば教えていただけると幸いです。
Dockerfile の ADD(COPY) に指定できるファイルやディレクトリのパスは、
Dockerfile と同じディレクトリからの相対パスでなくてはいけません。
そのため、同じファイルを ADD(COPY) したい場合は、
$ tree dockerfiles
dockerfiles
├── mysql
│ ├── Dockerfile
│ └── samefile
└── nginx
├── Dockerfile
└── samefile
2 directories, 4 files
のように、同じファイルをそれぞれのディレクトリに配置することになると思います。
ちなみに、symlink をはれば同じファイルを配置しなくて良いかと思いましたが、
ファイルへの symlink だった場合は symlink がそのまま追加され(symlink 先のファイルが置かれるわけではない)、
ディレクトリへの symlink だった場合は、docker build に失敗します。
試行錯誤した結果、
Dockerfile が symlink な場合は動作しましたので、
- 指定したディレクトリ以下の Dockerfile を探索する
- カレントディレクトリに Dockerfile の symlink をはる
- symlink をはった Dockerfile に対して docker build する(カレントディレクトリで docker build .)
するツールを書きました。
https://github.com/tkuchiki/multi-docker-build です。
install
https://github.com/tkuchiki/multi-docker-build/releases から、
環境に合わせた binary をダウンロードして unzip すればすぐにお試しいただけます。
使い方
コマンドのオプションは以下のとおりです。
※ github の README にも後日説明を書きます
$ ./multi-docker-build --help
NAME:
multi-docker-build - execute multiple docker build
USAGE:
multi-docker-build [options] [arguments...]
VERSION:
0.0.1
OPTIONS:
--help, -h show help
--options, -o docker build options
--tag, -t 'latest' docker image tag
--config, -c config file
--quiet, -q quiet mode
--version, -v print the version
オプションは以下のようになります。
- -o : docker build のオプション
- -t : image の tag(デフォルトは "latest")
- -c : image を key, tag を value とした json ファイルへの path
- -q : 標準出力に出力しない
-t はすべての docker build に同じ tag を指定することになるので、
image ごとに tag を変更したい場合は、-c で image を key, tag を value とした json ファイルへの path を指定することになります。
image は Dockerfile が置いてあるディレクトリ名を使います(一番上の tree の構成では、nginx と mysql)。
json の例を挙げると、
{
"nginx": "1.7",
"mysql": "5.6"
}
とすると、docker build -t nginx:1.7 .
や docker build -t mysql:5.6
のように実行されます。
json のキーと Dockerfile が置いてあるディレクトリ名が一致しない場合は、tag が latest になります。
このツールを使うと、同じファイルを ADD したいときに、
$ tree .
.
├── dockerfiles
│ ├── mysql
│ │ └── Dockerfile
│ └── nginx
│ └── Dockerfile
└── samefile
3 directories, 3 files
のような構成にしておけば、それぞれのディレクトリにファイルを配置する必要はなくなります。
上記の構成で以下のコマンドを実行すると、
$ multi-docker-build dockerfiles
内部では以下のコマンドが実行されるイメージです。
$ ln -s dockerfiles/mysql/Dockerfile .
$ docker build -t mysql:latest .
$ rm Dockerfile
$ ln -s dockerfiles/nginx/Dockerfile .
$ docker build -t nginx:latest .
$ rm Dockerfile
注意点
Dockerfile ごとに違うファイルやディレクトリを ADD したい場合は、
それぞれのディレクトリに置くことになると思います。
その場合、Dockerfile の位置が変わるため、
ADD に書く相対パスをそれ用に合わせる必要があります。
例
- ADD file /tmp/
+ ADD dockerfiles/nginx/file /tmp/
まとめ
複数 Dockerfile がある場合に、同じファイルを用意しなくても良くなる方法を提案しました。
ただ、かなり強引な方法ですので、もっとスマートに出来る方法があればその方法を採用したいです...