skip to content
私的歌詞倉庫

DockerfileとMakefileでよく使う項目

/ 6 min read

Updated:
Table of Contents

はじめに

モバイル開発をするときは滅多に書かないのですが、Web周りの開発環境を作るときはDockerfileをよく書きます。

久しぶりに触るとあの設定なんだっけ?というのがよくあるので忘備録として書きます。

ついでにDockerコマンドを楽に実行するためのMakefileについてもちょっとだけ書いています。

Docker

node.jsを動かすDockerfileをサンプルとします。

FROM node:21-bookworm
ARG SAMPLE_ARG
ENV SAMPLE_ARG=${SAMPLE_ARG}
RUN apt update && \
apt install npm -y
WORKDIR /app

FROM

イメージはDocker公式のイメージを使うようにしています。ただRubyなどはDocker公式ではなくRuby公式のDockerを使っています。

ARG

ビルドする時に値を渡したいときはARGで渡します。

Terminal window
docker build ~~~ SAMPLE_ARG='ここに渡したい値'

ENV

そのままの意味で環境変数をセットします。

RUN

イメージ内のライブラリ周りを最新にしたいので、先頭の方にとりあえずapt update を書きます。

Dockerは命令毎にキャッシュを効かせてくれるので、Dockerfileを書くときはいい感じにRUNなどを&&でまとめておきます。キャッシュを無視したいときは--no-cacheオプションを使ってビルドコマンドを実行します。

WORKDIR

作業ディレクトリを指定します。特にこだわりはないのですが、Dockerfileでappディレクトリを指定することが多い気がするので指定してます。

コマンド

Terminal window
docker build . -t sample

カレントディレクトリにDockerfileがあれば. を使います。-t でイメージの名前:タグ名を指定します。今回の場合はsample がイメージ名になって、タグ名を勝手にlatest にしてくれます。

先ほどちょっとだけ触れましたが、キャッシュを無視してビルドしたいときは--no-cache オプションを付けて実行します。

Terminal window
docker run -it --rm -v $(PWD):/app sample /bin/bash

run でコンテナを実行します。-it で標準入出力の設定をして、—-rmrun終了時にコンテナを削除します。これをつけないとコンテナがたまり続けてPCの容量を無駄にするので指定します。

-v でマウントするディレクトリを指定します。$(PWD):/app は左辺がローカルのパス、右辺がコンテナ内のパスです。$(PWD) はカレントディレクトリのパスを展開してくれるのでパスの指定が楽になります。

/bin/bash でコンテナ内のbashを立ち上げます。

Terminal window
docker run -it --rm -v $(PWD):/app -p 8001:3000 sample /bin/bash -c "yarn run dev"

実際に開発環境を立ち上げてブラウザで見るときは-p でポートフォワードを指定します。左辺がローカルで右辺がコンテナです。今回だと、ブラウザなどでlocalhost:8001 にアクセスするとコンテナの3000番に繋がります。

Makefile

dockerコマンドは長くて面倒なので大体Makefileを作って簡単に実行できるようにしています。

.PHONY: setup dev run
SAMPLE_ARG :=
setup:
docker build . -t sample ; \
docker run -it --rm -v $(PWD):/app sample /bin/bash -c "yarn install" ; \
echo SAMPLE_ARG=$(SAMPLE_ARG) > .env.local
dev:
docker run -it --rm -v $(PWD):/app -p 8001:3000 sample /bin/bash -c "yarn run dev"
run:
docker run -it --rm -v $(PWD):/app sample /bin/bash

.PHONY で実行する命令を指定します。別に書かなくても動きはするのですが、実行するターゲット名と同名のファイルがあるとエラーになるので、後々のためにもとりあえず指定します。

SAMPLE_ARG := でmakeコマンドを実行する時に変数を渡せます。

Terminal window
make setup SAMPLE_ARG='渡したい値'

終わりに

個人的によく使うDockerfileとMakefileの項目について書きました。

Docker周りは最初に作ってから触ることが少ないので、新しく作るたびに忘れます…あと開発環境を作るときは、docker composeを書くことが多いというのもあるかもです。

文章化したのでこれできっと忘れないと思います!(多分!!1)

ここまで書いて、昔も似たような内容を書いたような…と思っていたら書いてました😟

docker runでローカルのコードを実行する

参考文献