miyohideの日記

技術的なメモなどを記しています

2023年1月25日(水)Dockerfileとdocker-compose.ymlと.dockerignoreについて

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実行時にローカルのものはコピーされてしまうと言うわけ。なるほどなるほど。