[解決済み] OS XでDockerを使った開発環境を構築する正しい方法とは?
質問
紹介文
DockerとBoot2Dockerを使って、OS X上に開発環境を構築する良い方法が見つかりません。私が直面している問題は、ソース コードをどのように管理するかということです。
- すでにインストールしてあるツール (テキスト エディター、IDE、git など) を使用して、OS X 上でコードを修正することができます。
- それらの変更はDockerコンテナに反映されるので、テストを再実行したり、ウェブページを更新したりすると、すぐに変更を確認することができます。
理論的には、これは私のソースコードをボリュームとしてマウントすることで簡単にできるはずです。
docker run -it -v /path/to/my/source/code:/src some-docker-image
残念ながら、これには2つの大きな問題があり、OS Xでは全く使えません。
問題点 1: (vboxsf を使用する) VirtualBox 上のマウントされたボリュームは非常に遅い
例えば、ここでJekyllは私の ホームページ ソースコードは、Dockerイメージの一部である場合。
> docker run -it brikis98/yevgeniy-brikman-homepage:v1 bash
root@7aaea30d98a1:/src# time bundle exec jekyll build
[...]
real 0m7.879s
user 0m7.360s
sys 0m0.600s
以下は全く同じDockerイメージですが、今回はOS Xからソースコードをマウントしています。
> docker run -it -v $(pwd):/src brikis98/yevgeniy-brikman-homepage:v1 bash
root@1521b0b4ce6a:/src# time bundle exec jekyll build
[...]
real 1m14.701s
user 0m9.450s
sys 0m3.410s
問題2:ファイルウォッチングができない
SBT、Jekyll、gruntのデフォルトのウォッチ機構は、inotifyなどの技術を使用しており、それらがDockerコンテナで実行されている場合、OS Xでマウントされたフォルダに変更が行われた場合、動作しない。
試した回避策
解決策を検索し(SOにあるものをすべて含む)、いくつか試しましたが、成功するものは見つかりませんでした。
- I Boot2DockerがNFSを使用するように変更しました。 を使用するようにしましたが、同じように遅くなりました。
- 私は Vagrant + NFS を試してみましたが、これも同じように遅かったです。
- を試してみましたが Samba マウント を試しましたが、Docker コンテナでは常にフォルダが空で表示されました。
- を使おうとしたのですが Unison ファイルシステム を使ってみたところ、ファイルの同期には一時的に成功しましたが、その後ずっと 接続エラーが表示される .
- 私は Jekyllでポーリング を有効にしますが、それは大幅に私の変更がピックアップされるまでの遅延を増加させた。
- 私は試してみました ディンギー を試してみたところ、次のような結果が得られました。 いくつかの を改善しました。Jekyllのコンパイルが10-15倍遅くなる代わりに、2-3倍遅くなりました。それはより良いですが、まだ非常に使用可能ではありません。
実際に動作し、Docker と OS X で生産的にコードを開発できるようなソリューションを見つけた方はいらっしゃいますか?
更新: ついに解決策を発見!
Boot2Docker + rsync を使用して、生産的と思われる解決策をようやく見つけることができました。これをセットアップする方法の詳細は 私自身の回答 というオープンソースのプロジェクトと同様に docker-osx-dev .
どのように解決するのですか?
私は、これまでに見つけた最善の解決策を、私自身の答えとして追加することにしました。より良い方法が見つかったら、これを更新します。
これまでのところ最高の解決策
OS X上でDockerを使った生産的な開発環境をセットアップするために、私が見つけたベストソリューションです。
Boot2Docker + Rsync です。
. rsyncを使えば、Dockerコンテナでのビルド時間は、OSX上で直接ビルドを実行するのと同等になります! さらに、ファイルウォッチャーのコードでは
ではなく
はポーリングを必要としません (
inotify
は通常のフォルダを使うので動作します) ので、ホットリロードは
ほとんど
が高速になります。
設定方法には、自動インストールと手動インストールの2つがあります。
自動インストール
Boot2Docker を Rsync でセットアップするためのすべての手順を、次のようなオープン ソース プロジェクトにパッケージ化しました。 docker-osx-dev . コードは少し荒いですが、3つの異なる技術スタックを持つ3つのプロジェクト間で簡単に切り替えるために、私は数週間これをうまく使っています。試してみたり、バグを報告したり、PRを提出したりしてみてください。また、私のブログ記事もご覧ください。 OS XでDockerを使った生産的な開発環境 をご覧ください。
手動設定
-
インストール方法
Boot2Docker
:
brew install boot2docker
. -
Boot2Docker を実行しますが、VirtualBox の共有フォルダーは無効にしてください。
boot2docker init && boot2docker start --vbox-share=disable
. -
実行
boot2docker shellinit
を実行し、出力された環境変数をあなたの~/.bash_profile
ファイルにコピーします。 -
Boot2DockerのVMにrsyncをインストールします。
boot2docker ssh "tce-load -wi rsync"
. -
Boot2Docker VM に必要なベースフォルダを作成し、それらに正しいパーミッションを設定します。例えば、同期するために
/foo/bar
フォルダーを OS X から同期する場合、次のように作成する必要があります。/foo/bar
をBoot2DockerのVM上に作成します。boot2docker ssh "mkdir -p /foo/bar && chown -R docker /foo/bar"
. -
rsyncを実行して、ファイルをBoot2Docker VMに同期させます。
rsync --archive --rsh="ssh -i $HOME/.ssh/id_boot2docker -o StrictHostKeyChecking=no" /foo/bar docker@dockerhost:/foo
. rsync のドキュメントをチェックして、有効にしたい様々な設定、例えば--exclude .git
を除外するために.git
フォルダを同期時に除外します。 -
ファイルウォッチャーを使用して、ファイルの同期を維持します。例えば
fswatch
(
brew install fswatch
) を rsync にパイプします。 -
この時点では
docker run
を使って Docker コンテナを起動し、その中で-v
フラグを使用して、同期するフォルダをマウントします。docker run -v /foo/bar:/src some-docker-image
. -
通常通り OS X 上でコードを更新します。変更は rsync を使って非常に速く伝搬し、通常のファイルウォッチャーコードは通常通り変更をピックアップするはずです (つまり
inotify
を使用して)、そしてすべてのファイルがコンテナーに対して "local" であるため、ビルドは高速に実行されるはずです。 -
実行中のウェブサイトをテストする必要がある場合、コンテナ内で
boot2docker ip
コマンドを実行して、それがどの IP にあるのかを調べます。
関連
-
[解決済み] Dockerコンテナの中から、マシンのローカルホストに接続するにはどうすればよいですか?
-
[解決済み] ホストからDockerコンテナのIPアドレスを取得する方法
-
[解決済み] Dockerコンテナに環境変数を渡すにはどうしたらいいですか?
-
[解決済み] Dockerでデータベースなどの永続的なストレージを扱う方法
-
[解決済み] Dockerイメージはホストマシン上のどこに保存されていますか?
-
ffiのコンパイルに失敗しました *** extconf.rbに失敗しました *** 解決策
-
[解決済み】Dockerイメージとコンテナの違いは何ですか?
-
[解決済み] brew サービスで動作している Postgres サーバーに接続できない
-
[解決済み] MacでMonoDevelopを複数起動するにはどうしたらいいですか?
-
[解決済み] Mac OS Xでmongodを停止するクリーンな方法は何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Mac OSXでデフォルトゲートウェイを取得する方法
-
[解決済み] nginx の "ssl" ディレクティブは非推奨、"listen ... ssl" を使用すること。
-
[解決済み] 8080ポートを使っているプロセスを終了させて、Vagrantを起動させるにはどうしたらいいですか?
-
[解決済み] Visual Studio Codeで隠しファイルを表示する方法
-
[解決済み] Mac OS X での Vim Insert Mode
-
[解決済み] macOS Sierraでネットワークリンクコンディショナーが動作しない。
-
[解決済み] dyld: ライブラリがロードされません。rpath/libswiftAVFoundation.dylib です。
-
[解決済み] Mac OS X でファイルがどのプロセスで使用されているかを確認する
-
[解決済み] macプロンプトでのスクリプト実行 "Permission denied"
-
[解決済み] Mac OSでのSSHタイムアウトを回避する?[クローズド]