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

Source: https://habr.com/ru/post/J240277/


All Articles