Dockerを使っていて、開発中に頻繁に変更する部分、ソースコードなどをCOPY
などでコンテナ内に持って行くと毎回ビルドされて大変。とりあえずホストのディレクトリをボリュームとして使えるのでそれを利用すると楽。
構成
Dockerfileの隣にある./mnt/
にnodeアプリケーションをおき、ボリュームとして利用してみる例。もしベストプラクティスの構成があるなら早く覚えたい気持ちはある。
$ tree
.
├── Dockerfile
├── README.md
├── conf
│ └── aws
│ ├── credentials
│ └── credentials.orig
└── mnt
└── app
├── index.html
└── index.js
設定
以下はnodeのaws-sdk
を使うための設定で本題には関係ない。
$ cp -p conf/aws/credentials.orig conf/aws/credentials
$ vi conf/aws/credentials.orig
credentials.orig
[default]
aws_access_key_id = XXXX
aws_secret_access_key = XXXX
全体をgit管理に入れ、credentials
は.gitignore
しておく。
Dockerfile
必要なコマンドを書く。アプリケーションのある ./mnt/
はCOPY
の対象から除いてあるが、あとでボリュームとして使えるようになる。nodeモジュール管理もpackage.json
でうまくやりたい。
FROM centos:centos6
ENV HOME /root/
WORKDIR $HOME
RUN yum -y install tcpdump
RUN yum -y install cairo cairo-devel cairomm-devel libjpeg-turbo-devel pango pango-devel pangomm pangomm-devel giflib-devel
RUN rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
RUN yum -y install npm
EXPOSE 8080
COPY conf/aws/* $HOME/.aws/
RUN npm install express@3.2.4
RUN npm install d3
RUN npm install aws-sdk
RUN npm install canvas
RUN npm install fs
RUN npm install socket.io
ENV NODE_PATH $HOME/node_modules
CMD ["node", "/mnt/app/index.js"]
ボリュームを使うには-v
オプションでdocker run
する。ホスト側のディレクトリは絶対パスでないといけない。
$ docker build -t node .
$ docker run -it -v `pwd`/mnt/app:/mnt/app node
Running on port...
コマンドを指定しない場合、CMD
で指定しておいたコマンドが実行される。
これで
- 大半一度で決まる設定やインストールはコンテナ内
- 頻繁なソースコード変更はコンテナ外
におき、ビルド工数を最小化しながら両方git管理するという分離ができる。