OS XでのWeb開発者向けのDockerコンテナ

私は現在すべての開発をdockerコンテナを使用して行っています。Linuxでこのアプローチが問題を引き起こさない場合、OS Xでは信じられないほどの時間と労力がかかる場合があります。



これらの瞬間の一つについてお話したいと思います。



私の場合、dockerを使用した開発は次のようになります。必要なソフトウェアはすべてコンテナで調達されます。 作業中のプロジェクトのあるフォルダーは、ホストシステムからコンテナーにマップされます。 autobuildのコンテナでは、 gruntが grunt-contrib-watchまたはwatchifyで設定されているか、 inotify-toolsを使用するスクリプトがハングすることがあります。



Web開発の場合、サイクルは簡単です。ケシのプロジェクトファイルを編集し、ユーティリティがビルドを開始するのを監視し、livereloadがWebページを更新します。 しかし、このアプローチでは問題がすぐに発生します。VirtualboxGuest Additionsに含まれるvboxsfファイルシステムは非常に遅いため、次のようになります。





これは受け入れられません。



簡単なグーグルは、 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つの問題がなくなります。





しかし、新しい問題が発生します。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ファイルの日付とタッチコマンドを実行します。 以下に、プロジェクトのソースコード外にある理由を説明します





それが機能することを確認してください、あなたはこれを行うことができます:





そして、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はこの問題に対するより簡単な解決策を示しました。そのアプローチを使用することをお勧めします。



All Articles