適用可能状況
- Dockerを使っている
- Dockerのコンテナ外ではコンパイル/実行できない
問題点
- コード編集してから実行するたびに、
docker build
していては遅すぎてデバッグが捗らない
解決法
- build contextから不要なファイルを除去する
- volume (
docker run -v
)をうまく使う - .dockerignore ファイルを作成し不要なファイルをbuild contextに送らないようにする
詳細
よくあるDockerfileの例
RUN yum install -y いろいろ
# Setup SSH for git clone
ENV HOME /root
ADD ssh/ /root/.ssh
RUN chmod 600 /root/.ssh/*; ssh-keyscan bitbucket.org > /root/.ssh/known_hosts
# Get Project and compile
RUN git clone git@bitbucket.org:xanxys/coolproject.git; \
cd coolproject; \
scons # でもmakeでもなんでも
(遠隔)リポジトリにcommitされていればdocker build
によって新しいイメージを作成可能だが(git clone
時にキャッシュ無効化する方法が必要だがそれはここでは扱わない)遅いし、毎回commitするのは面倒。
遅い要因: 巨大なbuild context
Sending build context to Docker daemon
に時間がかかっている場合: docker buildは指定されたディレクトリ全てをシリアライズしてdaemonに送るので大きい.git
やデータがある場合すごく遅い。
(cf. Dockerfile Reference)
Dockerfileを適当なsub-directoryに移動することで解決する
もしくは .dockerignore ファイルをDockerfileと同じ場所に作成し、.git 等のディレクトリやファイル名を記述しておくとbuild contextを小さくすることができる。
遅い要因: git clone
毎回リポジトリ全体をダウンロードするので遅いし、サーバーが落ちてるとデバッグできないのは困る。
プロジェクトの構成が以下のようになっているとき
coolproject
|-.git
|-hoge.cpp
|-hoge2.cpp
|-SConstruct
|-docker
|-Dockerfile
docker run -ti -v $(pwd):/root/local imageの名前 bash
などとして、コンテナ内の/root/local
で(ローカルでやるのと同じように)scons
すると、リポジトリにcommitされてないコードの編集も読んでくれるし、ファイルのIOも可能。