「docker build」 で指定するのは Dockerfile ファイルじゃなくて Dockerfile があるフォルダ
コマンドを実行したカレントディレクトリを問わずに そのフォルダがカレントディレクトリとしてビルド処理が実行される
なので COPY コマンドの from 側の相対パスは指定した Dockerfile のあるフォルダになる
もっと正確にいうと 選択したフォルダがビルドのコンテキストになる
デフォルトではコンテキストのルートにある Dockerfile が使われる
コンテキストの中にあるファイルしか使えないので COPY で 「../」 を使って外側を参照できない
例えば複数の Dockerfile で共通のデータを使いたくてこういうフォルダ構造になってる場合
- common/common_file.txt
- image1/Dockerfile
- image2/Dockerfile
image1 をコンテキストにしてしまうと common の中身を参照できない
コンテキストを common や image1 があるフォルダにして 使用する Dockerfile のパスを別に指定することで解決できる
-f オプションを使って コンテキストのルートからの相対パスで Dockerfile の場所を指定する
ファイル名も指定するので Dockerfile という名前以外も可能
docker build -f image1/Dockerfile .
この場合 image1 のビルド時に image2 もコンテキストに含まれる
コンテキスト内のすべてのデータはビルド時にコピーされるので image2 のデータのコピーはムダになる
.dockerignore ファイルを用意することでコンテキストからファイルを除外できる
- image1/Dockerfile.dockerignore
- image2/Dockerfile.dockerignore
を作ってそれぞれのビルド時にコンテキストから除外したいファイルのパターンを指定する
基本は .gitignore みたいな記法
記法の詳細
https://docs.docker.com/build/building/context/#syntax
・ 最初に / があってもなくてもコンテキストのルートからのパスとして扱われる
・ ? や * のワイルドカードが使える
・ */foo でルートの任意のサブディレクトリの foo
・ **/foo で任意の階層の foo
・ # でコメント
・ ! で除外指定