Dockerfileがあるディレクトリから親ディレクトリを参照する

Dockerfileがあるディレクトリから親ディレクトリを参照する際に、詰まったのでメモします。

Dockerfileをビルドしようとすると、普通Dockerfileのディレクトリに移動して

docker build -t service .

でビルドできます。しかし、ここで落とし穴があって、このビルド方法の場合、そのディレクトリ内のみにしかアクセスできません。

たとえば以下のようなディレクトリ構成の場合、distディレクトリからビルドするとscriptディレクトリにはアクセスできません。

project/
    Dockerfile
    dist/
        Dockerfile
    test/
        Dockerfile
    script/
        foo

この問題を解決するには、以下のようにdist/Dockerfileを書き

FROM ubuntu:14.04

COPY script/foo /script/foo

プロジェクトのルートで以下のようにコマンドすることで正常にビルドされます。

docker build -t service-dist -f dist/Dockerfile .

この問題を解決した方法は以下の2つの情報から考えることが出来ます。

  • Dockerfileがビルドされる時のカレントディレクトリはdocker build DIRで指定したDIRである。
  • Dockerfileは、-fオプションでどこからでも読み込むことができる

つまり、ビルドするときのカレントディレクトリは、Dockerfileのあるディレクトリではなく、buildコマンドで指定したDIRであると言うことです。したがって、Dockerfileには親ディレクトリから見たパスを書き、ビルド時に指定するDIRには、親ディレクトリを指定すれば問題が解決できます。

結論

Dockerfileがあるディレクトリから親ディレクトリを参照したい場合、Dockerfileには親ディレクトリから見たパスを書き、ビルド時に指定するDIRには、親ディレクトリを指定すれば正常にビルドすることができます。

参考

Specify Dockerfile (-f)