Docker Composeでnginxサーバを実行するときに犯したアホなミス

## 最初にやったこと

Docker Compose を使って、nginxを起動させる。

```yml:docker-compose.yml
version: "3"
services:
  nginx:
    image: nginx:1.19-alpine
    ports:
      - "8080:80"
```

`docker-compose.yml` を用意し、

```sh
$ docker-compose up -d
Creating network "project_default" with the default driver
Creating project_nginx_1 ... done
```

コンテナを作成、起動させ、

http://localhost:8080

にアクセスすると、


![スクリーンショット 2020-11-06 16.57.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230954/19acc1b8-09d3-15a4-c6ee-79cff22c3b1b.png)



うまく表示された。

## 次にやったこと

`Dockerfile` も使って上でやったことと同じことをやってみる。

```sh
├── docker
│   └── nginx
│       └── Dockerfile
└── docker-compose.yml
```

ファイルをこのように配置して、

```yml:docker-compose.yml
version: "3"
services:
  nginx:
    build: ./docker/nginx/Dockerfile
    ports:
      - "8080:80"
```

```Dockerfile:docker/nginx/Dockerfile
FROM nginx:1.19-alpine
```

`docker-compose.yml` および `Dockerfile` をこのように書き、コンテナを実行すると、

```sh
$ docker-compose up -d --build
Creating network "project_default" with the default driver
Building nginx
Traceback (most recent call last):
  File "docker-compose", line 3, in <module>
  File "compose/cli/main.py", line 67, in main
  File "compose/cli/main.py", line 126, in perform_command
  File "compose/cli/main.py", line 1070, in up
  File "compose/cli/main.py", line 1066, in up
  File "compose/project.py", line 615, in up
  File "compose/service.py", line 346, in ensure_image_exists
  File "compose/service.py", line 1125, in build
  File "site-packages/docker/api/build.py", line 148, in build
TypeError: You must specify a directory to build in path
[73736] Failed to execute script docker-compose
```

失敗した。

## 何を間違えたか

```yml:docker-compose.yml
version: "3"
services:
  nginx:
    build: ./docker/nginx # ここを間違えていた
    ports:
      - "8080:80"
```

間違えたのは `docker-compose.yml` の `build` の値。  
`Dockerfile` のパスを書いていたので、`Dockerfile` を配置しているディレクトリのパスに書き直して実行すると、

```sh
$ docker-compose up -d --build
Creating network "project_default" with the default driver
Building nginx
Step 1/1 : FROM nginx:1.19-alpine
 ---> bd53a8aa5ac9

Successfully built bd53a8aa5ac9
Successfully tagged project_nginx:latest
Creating project_nginx_1 ... done
```

http://localhost:8080

![スクリーンショット 2020-11-06 16.57.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230954/b13f6f1d-5b71-beea-914f-b8c762a81ea3.png)

成功した。

## 解説

[`build`](https://docs.docker.jp/compose/compose-file.html#build) は構築時に適用するオプションを指定する。  
**Dockerfileがあるディレクトリ**のパスやGitリポジトリのURLを指定するのであって、Dockerfileのパスを指定するのではない。  
~~因みに[`build`](https://docs.docker.jp/compose/compose-file.html#build) と [`image`](https://docs.docker.jp/compose/compose-file.html#image) は同時に使えない。~~ ← バージョン1の情報でした。（[Compose ファイル・リファレンス](https://docs.docker.jp/compose/compose-file.html#build)）

> バージョン１のフォーマット では、 build の使い方が異なります：

> - build: . の文字列のみ許可されています。オブジェクトは指定できません。
> - **build と image は同時に使えません。指定するとエラーになります。**  

> [Compose ファイル・リファレンス](https://docs.docker.jp/compose/compose-file.html#build)より

## 参考

- [Docker Compose入門 (2) ～ウェブサーバの開発環境を作るための準備～ | さくらのナレッジ](https://knowledge.sakura.ad.jp/23632/)
- [Compose ファイル・リファレンス — Docker-docs-ja 17.06 ドキュメント](https://docs.docker.jp/compose/compose-file.html#volume-configuration-reference)
- [nginx - Docker Hub](https://hub.docker.com/_/nginx)