と言う事に今更ながら気がついたんでメモ。
開発環境をプロジェクト毎に Docker 化する利点
- 普段使う環境と開発環境の分離が出来る
- 普段使う環境から開発環境を切り離せるし、ソフトウェアの依存解決も楽になる
- また、普段の環境では動かせないソフトウェアを開発時に動かせる様にもなる
- 開発時に必要なミドルウェアなどを使い捨てで実行出来る
docker-compose
を使えば、コマンド一発で開発に必要なサービスを立ち上げられる- またコマンド実行を
make
経由にすれば、面倒なコマンド入力からも開放される
- 開発環境の再現性が上がる
- 少なくとも 開発環境の構築に失敗してホスト環境が壊れる って事は無くなる
- あと集団で開発する場合、他の誰かに開発環境を用意させる際も楽になる
開発環境をプロジェクト毎に Docker 化する欠点
- 少なくとも docker はキチンと動作させる必要がある
- また Windows や macOS では docker を動作させるのに VM が必要なる(はず)
- Docker 上の使わないコンテナを放置すると、ファイルの容量が結構消費されてる事が発生する
自分の環境(NixOS)での利点
これは開発時に動かすソフトウェアにも依るんだけど、 NixOS だと開発時に必要となるソフトウェアを動作させる事に NixOS 特有の制約が掛かって来る場合があって、 そういうのを手軽に回避したい……という時なんかに Docker を使うとかなり便利だった。
で、具体的には最近だと elm
で開発する時にそういう(NixOS 特有の)制約に引掛っていて、
elm
を使う開発が面倒になりかかってたんだけど、これを Docker で回避したところ開発体験としてはかなり良い感じになった。
ちなみに自分の環境では Docker を使って開発環境を整える際に、
etc/docker-compose.dev.yml
- 開発環境を走らせるためのdocker-compose.yml
etc/Dockerfile
- 開発環境となるコンテナを用意する為のDockerfile
Makefile
- 上記ファイルを利用する際にコマンドをmake
経由で実行する
という感じのファイルを用意して、基本的には make
経由で docker-compose
を実行させたりしています。
あと上記の三つのファイルは、今作ってるモノだと下記の様な感じになってます:
version: "3" services: serve: build: . working_dir: /app ports: - "8080:8080" volumes: - ../:/app command: - sh - -c - "usermod -u 1000 -o node && groupmod -g 100 -o node && sudo -u node yarn install && sudo -u node yarn run serve" shell: build: . working_dir: /app ports: - "8080:8080" volumes: - ../:/app command: - sh - -c - "usermod -u 1000 -o node && groupmod -g 100 -o node && sudo -u node sh"
FROM node:current-alpine ENV NPM_CONFIG_PREFIX=/home/node/.npm-global RUN apk add --no-cache \ shadow sudo \ unzip zip bzip2 gzip p7zip tar xz \ gmp CMD [ "sh" ]
.PHONY: serve shell serve: @docker-compose -f etc/docker-compose.dev.yaml run --rm --service-ports serve shell: @docker-compose -f etc/docker-compose.dev.yaml run --rm --service-ports shell
以上
という事で Docker で開発環境を用意すると結構便利だよーって話でした。はい。