こんにちは!
seiです。
DockerFileを開発環境用、本番環境用と同じgitリポジトリで管理したいときってありませんか?
Dockerは基本的にDockerファイルがあるディレクトリ以下にあるファイルしかビルドすることができません。
したがって、開発環境用と本番環境用Dockerファイルを分けようとすると、以下のようにアプリケーションのディレクトリがある階層にDockerファイルを複数おかなくてはなりません。
some_project/
├ Dockerfile_dev/
├ Dockerfile_prod/
└ app/
└ models/
しかし、docker-compose.yamlのコンテキストを使えば、ビルドに使うディレクトリを指定することができます。
今回目指したディレクトリ構造は以下です。
some_project/
├ docker/
│ └ dev/
│ ├ docker-compose-dev.yaml
│ └ Dockerfile/
│ └ prod/
│ ├ docker-compose-prod.yaml
│ └ Dockerfile/
└ app/
コンテナビルド時にDockerファイルより上のディレクトリを用いる方法
では早速、docker-compose-dev.yamlを見ていきましょう!
buildの内容にcontexを追加してください。
version: '3'
services:
my-service:
build:
# appがあるディレクトリを指定
context: ../../
# コンテキストから見たDockerfileの位置
dockerfile: ./docker/dev/Dockerfile
ポイントはDockerファイルの位置は「contextで指定したディレクトリ」から見たパスを指定することです。
これだけで以下のようにDockerファイルより上のディレクトリを参照できるようになります。
Dockerfileの書き方は普通にDokcerファイルから見たパスで考えて構築してください。
Dockerfile
FROM python:3.10
# Dockerファイルより上の階層を指定できる!
COPY ../../app /var/www/app
まとめ
現在業務でDockerコンテナを使ったデプロイを行っています。
今まで開発環境でしか使用したことがなかったので、デプロイとなるとまたいろんな使い方を知らないといけないですね!
Dockerは軽くてオーバーヘッドが少ないので、インスタンス内でコンテナを構築してデプロイしてもOKです。Dockerの分ほんの少しリソースを使いますが、インスタンスに直で環境構築した場合とほぼ同じパフォーマンスが出ます。
再配布やバージョン管理、複数インスタンスでの環境統一にとても便利な技術だと思います。
今は権限周りで少し悩んでいるので、知見が貯まったらまた記事にしようと思います!