さいとブログ

docker-compose.ymlから別の階層にあるDockefileを指定する方法

今回はdocker-compose.ymlでDocker imageを指定するときにymlファイル内にimageオプションで直接指定せず、
buildオプションから別階層にあるDockerfileを指定したいときに少し詰まったので、記録として解決法を残しておきます。

version

Docker 20.10.0
docker-compose 1.27.4


ディレクトリ構成
こんな感じの構成でやります。

├── docker
│  ├── app
│  │  ├── Dockerfile
│  │  └── php.ini
│  ├── db
│  │  ├── Dockerfile
│  │  └── my.cnf
│  │    └── my.cnf
│  └── web
│    ├── Dockerfile
│    └── default.conf
└── docker-compose.yml


php, mysql, Nginxのコンテナを作るためにディレクトリでそれぞれ分けています。

結論

docker-compose.ymlのbuildオプションのところに
contextdockerfileを指定して記述します。

version: "3.8"
services:
 web:
  build:
   context: ./ <-ココを記述!
   dockerfile: ./docker/web/Dockerfile
  depends_on:
   - app

  ---省略---

 app:
  build:
   context: ./ <-ココを記述!
   dockerfile: ./docker/app/Dockerfile
  depends_on:
   - db

  ---省略---

 db:
  build:
   context: ./ <-ココを記述!
   dockerfile: ./docker/db/Dockerfile

  ---省略---


説明

先ほどのymlファイルの記述について説明します。

services:
 web:
  build:
   context: ./
   dockerfile: ./docker/web/Dockerfile


contextオプションを追加して./とすることで、docker-compose.ymlファイルのあるディレクトリを
指定します。
こうすることでここを基準にして、後述するDockerfileを探してくれます。

あとはdockerfileオプションも追加して、./docker/web/Dockerfileとすることで
docker-compose.ymlファイルのあるディレクトリを基準に指定したDockerfileを参照してくれます。

これでimageオプションを使わずにDockerfileからコンテナを作ることができるようになった。
最初からDockerfileを作成して指定しておけば、AWSのECRにpushするときに焦らなくて済むようになるので、少しは楽になるかな。。

参考


プロフィール

profile icon

saitoです。
ソフトウェアエンジニアとして働いています。
web開発に関する学びを当ブログに書き残しています。