カラクリスタ

「輝かしい青春」なんて失かった人のブログ

開発環境は プロジェクト毎に Docker で管理してくと後々楽が出来る

と言う事に今更ながら気がついたんでメモ。

開発環境をプロジェクト毎に Docker 化する利点

  • 普段使う環境と開発環境の分離が出来る
    • 普段使う環境から開発環境を切り離せるし、ソフトウェアの依存解決も楽になる
    • また、普段の環境では動かせないソフトウェアを開発時に動かせる様にもなる
  • 開発時に必要なミドルウェアなどを使い捨てで実行出来る
    • docker-compose を使えば、コマンド一発で開発に必要なサービスを立ち上げられる
    • またコマンド実行を make 経由にすれば、面倒なコマンド入力からも開放される
  • 開発環境の再現性が上がる
    • 少なくとも 開発環境の構築に失敗してホスト環境が壊れる って事は無くなる
    • あと集団で開発する場合、他の誰かに開発環境を用意させる際も楽になる

開発環境をプロジェクト毎に Docker 化する欠点

  • 少なくとも docker はキチンと動作させる必要がある
  • また WindowsmacOS では 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 で開発環境を用意すると結構便利だよーって話でした。はい。