2016-01-18 11 views
6

私はdocker-composeを使用してオーケストレーションされた 'システム'のサービスで作業しています。サービスはコンパイルされた言語で書かれており、私が変更を加えると、そのサービスを再構築する必要があります。私は、変更を迅速に繰り返す最善の方法を見つけようとしています。Docker-composeセットアップでコンパイルされたコンポーネントのドッカー開発ワークフロー

私は2つの 'ワークフロー'を試しました。どちらも最新のソースを入手するためにvolume:を経由してソースディレクトリにリンクされています。

A.
  • docker-compose up -d
  • 停止開発中のサービスのコンテナ
  • を実行し、そのコンテナの実行コンパイルして実行内の画像docker-compose run --name SERVICE --rm SERVICE /bin/bash
  • を使用して、新しいコンテナとすべてのサポートコンテナを起動します露出したポートのアプリケーション
  • 実行中のプロセスを停止し、再構築して再起動します。
B.
  • (構築し、サービスを実行するためにDockerfile CMDが必要です)
  • ストップサービス:docker-compose kill SERVICE
  • 再起動サービスdocker-compose up -d --no-deps SERVICE

問題がでもあります再起動に時間がかかりすぎる vsローカルでサービスを再起動しているfドッカー)。この設定は、変更されたファイルをホットリロードすることができるインタープリター言語では問題ないと思われますが、コンパイルされた言語サービス用の適切な高速システムをまだ見つけていません。

実行docker-compose upをしかし:

+1

ドッカーはノートパソコンで、またはリモートで実行していますか? 「ローカルでサービスを再開することと対話する」という意味を思い出してください。 「再起動には時間がかかりすぎる」原因は何ですか?コンパイルは遅いですか?起動? – thaJeztah

+0

私はこの問題をより明確にしようとしました。ドッカーはドッカーマシンを介して実行されています。私が「ローカルで走っている」と言うと、ドッカーを使わずにサービスを構築して実行することを意味します。これはオプションですが、データベースのURLなどを変更する必要があることを意味します。 –

+0

ああ、私の最高の推測は、まずホストとVirtualBox VMの間のファイル共有は(うまくいけば)あまり実演していない。これはVirtualBoxのファイル共有の制限です。第2に、VMはパフォーマンスを最大限に調整することができないため、コンパイル時間に差が生じる可能性があります。やってみましたか? VMのメモリおよび/またはCPUの数を増やしますか? – thaJeztah

答えて

3

私はこれを行うだろう

  • は次のように何かをentrypointを使用する代わりに、ソース
  • のコンパイルバイナリのディレクトリのホストボリュームを使用します

entrypoint.sh:

trap "pkill -f the_binary_name" SIGHUP 
trap "exit" SIGTERM 

while [[ 1 ]]; do 
    ./the_binary_name; 
done 

は、バイナリを再構築するためのスクリプトを書き、docker-compose.ymlにサービスによって使用されるボリュームにコピー:

# Run a container to compile and build the binary 
docker run -ti -v $SOURCE:/path -v $DEST:/target some_image build_the_binary 

# copy it to the host volume directory 
copy $DEST/... /volume/shared/with/running/container 

# signal the container 
docker kill -s SIGHUP container_name 

ので、ソースとマウントこのスクリプトを使用してバイナリをコンパイルしますボリュームとしての宛先ディレクトリ。 $DESTが "実行"コンテナと共有されているボリュームディレクトリと同じ場合、コピー手順をスキップできます。最後に、スクリプトは実行中のコンテナに古いプロセス(古いバイナリを実行していたプロセス)を強制終了し、新しいプロセスを開始するように通知します。

コンテナ内で共有ボリュームのコンパイルが遅すぎる場合は、ホスト上でコンパイルを実行し、コピーとシグナリングを実行してコンテナ内で実行することもできます。

このソリューションには、「ランタイム」イメージにすべてのdev依存関係が必要ないという利点があります。それは単なる裸のOSベースで非常に痩せたイメージかもしれません。

+1

こんにちは、深い答えに感謝します。これは多く説明しています。私はあなたがここで概説しているように、それを多く働かせることができました。一つの違いは、私は 'docker kill -s SIGHUP'を動作させることができませんでした。代わりに' docker exec web pkill -f container_name'を使用しています。これほど高速ではないかもしれませんが、この方法に切り替えると、1回の「反復」の時間が大幅に短縮されます。ありがとう。 –

関連する問題