docker-composeを使ってnode.js開発環境を整える
Docker Language Stackのgolangなどを見るとcontainerの中でbuildやmakeする使い方が書かれている。
$ docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp golang:1.3 go build -v
$ docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp golang:1.3 make
これをdocker-composeを使ったらもう少し楽にできるような気がしたので、nodeの開発環境をdocker-composeを使ってみたらどうなるか?の試み。composeの使い方としては亜流な気もするが(汗。コードはnode-dev-container参照。
Dockerfile
必要なツールのインストールされた docker image を作っておく。
$ docker build -t node-dev .
Dockerfile
FROM node:latest
# install tools
RUN npm install -g gulp \
&& npm install -g coffee-script \
&& npm cache clear
docker-compose
開発に必要なコマンド(node/npm/gulp)や初期インストール用のコマンド(express-install/gulp-install) をserviceとして定義する。
docker-compose.yml
default: &default
image: node-dev
volumes:
- $PWD:/usr/src/app
working_dir: /usr/src/app
node:
<<: *default
entrypoint: ['node']
ports:
- "3000:3000"
npm:
<<: *default
entrypoint: ['npm']
gulp:
<<: *default
entrypoint: ['gulp']
init:
<<: *default
command: npm init
express-install:
<<: *default
command: npm install express --save
gulp-install:
<<: *default
command: npm install gulp gulp-coffee --save-dev
例えば、expressで開発するなら
$ docker-compose run --rm init # package.jsonを作る
$ docker-compose run --rm express-install # express.js インストール
(app.jsを実装して)
$ docker-compose run --service-ports node app.js # node 実行
まとめ
docker-composeのone-offコマンドを使ってcontainer内の開発環境をうまく使えないかと試してみたが、dockerコマンドから使うのに比べてさほど「楽」にはならなかった。workflowに必要なコマンドやvolumeのマウント、portのマッピングをdocker-compose.ymlにまとめておける点に多少メリットはある気もする。
あと container内で gulp の watch が何故かうまく動かない…