LoginSignup
18
15

More than 5 years have passed since last update.

Docker利用時に短ターンアラウンドタイムでデバッグする方法

Last updated at Posted at 2014-09-14

適用可能状況

  • Dockerを使っている
  • Dockerのコンテナ外ではコンパイル/実行できない

問題点

  • コード編集してから実行するたびに、docker buildしていては遅すぎてデバッグが捗らない

解決法

  • build contextから不要なファイルを除去する
  • volume (docker run -v)をうまく使う
  • .dockerignore ファイルを作成し不要なファイルをbuild contextに送らないようにする

詳細

よくあるDockerfileの例

docker
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も可能。

18
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
15