.dockerignoreの配置場所
コンテナで環境構築する際も、本番稼働用のDockerfileを作る際にも.dockerignoreは基本的に用意すると思います。
その中で、いろんなシチュエーションにおいて.dockerignoreは機能するのか?
適切な配置場所は?
と気になったのでいくつかのパターンで検証してみました。
結論
いくつか試した結論として、dockerのbuild contextのルートにあればどの状況でも効くようです。
build contextって何?って人はこちらを参考に。
Docker関連ファイルの内容
どのパターンの検証も基本的に内容は一緒です。(一部場合によって変えます。)
開発環境の構築においてはdocker composeを利用することが多いと思いますので、compose前提です。
Dockerfile
FROM busybox
WORKDIR /workspace
COPY *.txt .
compose.yaml
services:
sample:
build:
context: .
dockerfile: Dockerfile
image: docker-ignore-test-sample
container_name: docker-ignore-test-sample
.dockerignore
mushi.txt
さらにルートディレクトリに以下の2つのファイルを置いて、not_mushi.txtだけが存在すればOKという検証をします。
- mushi.txt
- not_mushi.txt
確認のためのコマンド
docker compose run sample ls
検証
パターン1: すべてルートディレクトリに
最も標準的な構成。
【ディレクトリ構成】
.
├── .dockerignore
├── compose.yaml
├── Dockerfile
├── mushi.txt
└── not_mushi.txt
【結果】
$ docker compose run sample ls
not_mushi.txt
もちろんOK!
パターン2: Docker関連ファイルをサブディレクトリに配置
ルートを散らかしたくないという人だとこういう構成をとる場合もあると思います。
重要なのは.dockerignoreがcontextのルートにいる必要があるということ。
【ディレクトリ構成】
.
├── .dockerignore
├── docker
│ ├── Dockerfile
│ └── compose.yaml
├── mushi.txt
└── not_mushi.txt
【結果】
$ docker compose run sample ls
not_mushi.txt
OK!
また、このパターンではcompose.yamlを以下のようにしてcontextをルートディレクトリに移動しています。
services:
sample:
build:
context: .. # ここを変更!
dockerfile: docker/Dockerfile # ここを変更!
image: docker-ignore-test-sample
container_name: docker-ignore-test-sample
パターン3: VSCode DevContainerの利用
サブディレクトリ切る版にさらにdevcontainerの設定を追加。
【ディレクトリ構成】
.
├── .devcontainer
│ └── devcontainer.json
├── .dockerignore
├── docker
│ ├── Dockerfile
│ └── compose.yaml
├── mushi.txt
└── not_mushi.txt
【結果】
ばっちり。
おわりに
結論は上に書いた通りで、単純でした。
docker関連ファイルをディレクトリ切って格納したい人からするとルートに.dockerignoreだけ置かなければいけないのは気持ち悪いかもしれませんが、これは仕方ないですね。
まあだからこそ "." から始まるようになっているのかもしれません。