Dockerfileとdocker-compose.ymlと.dockerignoreについて
どハマりしたので整理。
元々は、docker-compose build
してイメージを作り、docker-compose run
で動かしたところ、.dockerignore
に指定したファイルが含まれている!と思ったのがきっかけ。
簡単に以下のものを作ってみた。
Dockerfile
は以下のもの。
FROM ubuntu COPY . /app
.dockerignore
は以下のもの。
README.md
docker-compose.yml
は以下のもの。
version: '3' services: web: build: context: . image: hogehoge:0.0.1 stdin_open: true tty: true volumes: - .:/app working_dir: /app
これで、docker-compose build
して、docker-compose run web /bin/bash
を実行すると以下の結果となる。README.md
が含まれてしまっている。
$ docker-compose run web /bin/bash root@920c18ec8635:/app# ls -l total 12 -rw-r--r-- 1 root root 25 Jan 24 12:08 Dockerfile -rw-r--r-- 1 root root 9 Jan 24 12:09 README.md -rw-r--r-- 1 root root 169 Jan 24 12:10 docker-compose.yml root@920c18ec8635:/app#
よくよく落ち着いて考えてみると、至極当然。まず、docker-compose build
の時点で作成されたイメージhogehoge:0.0.1
にはREADME.mdは含まれていない。
% docker run --rm -it hogehoge:0.0.1 /bin/bash root@92ca44fe9c61:/# cd /app root@92ca44fe9c61:/app# ls -l total 8 -rw-r--r-- 1 root root 25 Jan 24 12:08 Dockerfile -rw-r--r-- 1 root root 169 Jan 24 12:10 docker-compose.yml root@92ca44fe9c61:/app#
docker-compose.yml
にはvolumes
に.:/app
があるので、docker-compose run
実行時にローカルのものはコピーされてしまうと言うわけ。なるほどなるほど。