LoginSignup
9
8

More than 5 years have passed since last update.

Dockerfile が複数ある環境で同じファイルを ADD しなくて良くなるツール

Posted at

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 な場合は動作しましたので、

  1. 指定したディレクトリ以下の Dockerfile を探索する
  2. カレントディレクトリに Dockerfile の symlink をはる
  3. 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 がある場合に、同じファイルを用意しなくても良くなる方法を提案しました。
ただ、かなり強引な方法ですので、もっとスマートに出来る方法があればその方法を採用したいです...

9
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
8