これらの瞬間の一つについてお話したいと思います。
私の場合、dockerを使用した開発は次のようになります。必要なソフトウェアはすべてコンテナで調達されます。 作業中のプロジェクトのあるフォルダーは、ホストシステムからコンテナーにマップされます。 autobuildのコンテナでは、 gruntが grunt-contrib-watchまたはwatchifyで設定されているか、 inotify-toolsを使用するスクリプトがハングすることがあります。
Web開発の場合、サイクルは簡単です。ケシのプロジェクトファイルを編集し、ユーティリティがビルドを開始するのを監視し、livereloadがWebページを更新します。 しかし、このアプローチでは問題がすぐに発生します。VirtualboxGuest Additionsに含まれるvboxsfファイルシステムは非常に遅いため、次のようになります。
- ユーティリティが200パーセントのシステムのロードを開始するのを監視します。
- 小さなアセンブリでも-たとえば、ファイルの単純な連結には数十秒かかります。
これは受け入れられません。
簡単なグーグルは、 nfsがvboxfsよりも数倍速いことを示しました。 OSXでnfsサーバーをセットアップするのは簡単です。
# nfs sudo nfsd enable # sudo vi /etc/exports # /Users/user/my_web_project -mapall=ice # sudo nfsd checkexports # showmount -e
次に、ファイルシステムを取得できるように、ホストOSXアドレスをdocker ipに転送する必要があります。
# ip virtual box HOST_IP=`ifconfig vboxnet0 | tail -1 | awk '{print $2}'` # docker run --name smap -p 3080:3080 -e HOST_IP="$HOST_IP" -d -t sentimeta/node_scikit_image
コンテナーで、クライアントのnfsをロールし、必要なフォルダーをマウントする必要があります。
# sudo apt-get update sudo apt-get install nfs-common # nfs osx sudo mount -o nolock "$HOST_IP":/Users/user/my_web_project ~/my_web_project
そして実際、2つの問題がなくなります。
- CPU負荷がほぼゼロ。
- ビルドが非常に高速になりました。
しかし、新しい問題が発生します。nfsファイルシステムのイベントをinotifyし、すべての監視ユーティリティが座って通過しますが、10〜20秒の遅延が発生します。
これは受け入れられません。
したがって、ホストマシンでinotifyイベントのキャッチを開始し、情報をdockerコンテナに転送することが決定されました。
問題を解決するために、次のユーティリティを使用しました。
Docker側
http webサーバーをポート3080に配置します。
watch -n0 'printf "HTTP/1.1 200 OK\n\n$(date && touch /home/user/my_web_project/watchhelper.tmp)\n" | nc -l -p 3080 >/dev/null && date'
これは、ポート3080にぶら下がっているbash上の実際のWebサーバーです。リクエストごとに、watchhelper.tmpファイルの日付とタッチコマンドを実行します。 以下に、プロジェクトのソースコード外にある理由を説明します 。
- ファイルに「触れる」コマンドをタッチすると、アセンブリにつながるinotifyイベントが発生します。
- dateコマンドはテストに便利で、その出力はこのサーバーの答えです。
それが機能することを確認してください、あなたはこれを行うことができます:
- OSXでは、仮想マシンのboot2dockerアドレスを取得します。
boot2docker ip 2>&1 | sed -n 2,2p | awk -F' ' '{print $9}'
そして、hooray-ブラウザーで時間を確認し、コンテナで-watchユーティリティの即時操作を行います。
OSX側
fswatchをインストールします。
brew install fswatch
以下を開始します。
fswatch-run /Users/user/my_web_project/src "curl http://`boot2docker ip 2>&1 | sed -n 2,2p | awk -F' ' '{print $9}'`:3080"
これで、/ Users / user / my_web_project / srcフォルダー内のファイルを変更すると、コンテナーで発生したWebサーバーが呼び出され、ファイルに「タッチ」され、ビルドが発生します。
watchhelper.tmpファイルはプロジェクトソースの外部に配置する必要があります。nfsはそれでもinotifyイベントをスキップし、ソースにあるファイルはカールタッチタッチイベントの永遠のループを引き起こすためです。
mako用のdockerコンテナの設定に関するさまざまな問題istarkov / docker githubのプロジェクトに時々追加します。
トピックが応答を引き出す場合、OS Xで開発するときにdockerコンテナーを使用する場合に注意することがいくつかあります。
PS:
このアプローチには小さな問題があることを知らされました。
エディターが崇高なテキスト3であり、変更後のファイル長が同じままである場合、変更はクライアントのnfsに分類されません。 ドッカーで。
この方法で修正できます-崇高な設定で、Preferences.sublime-settingsファイルで、ガチョウ{{atomic_save ":true}を{" atomic_save ":false}に変更すると、すべてが正常に機能します。
PPS:
コメントで、 descentspbはこの問題に対するより簡単な解決策を示しました。そのアプローチを使用することをお勧めします。