Table of Contents
はじめに
モバイル開発をするときは滅多に書かないのですが、Web周りの開発環境を作るときはDockerfileをよく書きます。
久しぶりに触るとあの設定なんだっけ?というのがよくあるので忘備録として書きます。
ついでにDockerコマンドを楽に実行するためのMakefileについてもちょっとだけ書いています。
Docker
node.jsを動かすDockerfileをサンプルとします。
FROM node:21-bookwormARG SAMPLE_ARGENV SAMPLE_ARG=${SAMPLE_ARG}
RUN apt update && \ apt install npm -y
WORKDIR /appFROM
イメージはDocker公式のイメージを使うようにしています。ただRubyなどはDocker公式ではなくRuby公式のDockerを使っています。
ARG
ビルドする時に値を渡したいときはARGで渡します。
docker build ~~~ SAMPLE_ARG='ここに渡したい値'ENV
そのままの意味で環境変数をセットします。
RUN
イメージ内のライブラリ周りを最新にしたいので、先頭の方にとりあえずapt update を書きます。
Dockerは命令毎にキャッシュを効かせてくれるので、Dockerfileを書くときはいい感じにRUNなどを&&でまとめておきます。キャッシュを無視したいときは--no-cacheオプションを使ってビルドコマンドを実行します。
WORKDIR
作業ディレクトリを指定します。特にこだわりはないのですが、Dockerfileでappディレクトリを指定することが多い気がするので指定してます。
コマンド
docker build . -t sampleカレントディレクトリにDockerfileがあれば. を使います。-t でイメージの名前:タグ名を指定します。今回の場合はsample がイメージ名になって、タグ名を勝手にlatest にしてくれます。
先ほどちょっとだけ触れましたが、キャッシュを無視してビルドしたいときは--no-cache オプションを付けて実行します。
docker run -it --rm -v $(PWD):/app sample /bin/bashrun でコンテナを実行します。-it で標準入出力の設定をして、—-rm でrun終了時にコンテナを削除します。これをつけないとコンテナがたまり続けてPCの容量を無駄にするので指定します。
-v でマウントするディレクトリを指定します。$(PWD):/app は左辺がローカルのパス、右辺がコンテナ内のパスです。$(PWD) はカレントディレクトリのパスを展開してくれるのでパスの指定が楽になります。
/bin/bash でコンテナ内のbashを立ち上げます。
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コマンドを実行する時に変数を渡せます。
make setup SAMPLE_ARG='渡したい値'終わりに
個人的によく使うDockerfileとMakefileの項目について書きました。
Docker周りは最初に作ってから触ることが少ないので、新しく作るたびに忘れます…あと開発環境を作るときは、docker composeを書くことが多いというのもあるかもです。
文章化したのでこれできっと忘れないと思います!(多分!!1)
ここまで書いて、昔も似たような内容を書いたような…と思っていたら書いてました😟