1. ホーム
  2. macos

[解決済み] OS XでDockerを使った開発環境を構築する正しい方法とは?

2023-02-26 14:01:32

質問

紹介文

DockerとBoot2Dockerを使って、OS X上に開発環境を構築する良い方法が見つかりません。私が直面している問題は、ソース コードをどのように管理するかということです。

  1. すでにインストールしてあるツール (テキスト エディター、IDE、git など) を使用して、OS X 上でコードを修正することができます。
  2. それらの変更は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にあるものをすべて含む)、いくつか試しましたが、成功するものは見つかりませんでした。

  1. I Boot2DockerがNFSを使用するように変更しました。 を使用するようにしましたが、同じように遅くなりました。
  2. 私は Vagrant + NFS を試してみましたが、これも同じように遅かったです。
  3. を試してみましたが Samba マウント を試しましたが、Docker コンテナでは常にフォルダが空で表示されました。
  4. を使おうとしたのですが Unison ファイルシステム を使ってみたところ、ファイルの同期には一時的に成功しましたが、その後ずっと 接続エラーが表示される .
  5. 私は Jekyllでポーリング を有効にしますが、それは大幅に私の変更がピックアップされるまでの遅延を増加させた。
  6. 私は試してみました ディンギー を試してみたところ、次のような結果が得られました。 いくつかの を改善しました。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を使った生産的な開発環境 をご覧ください。

手動設定

  1. インストール方法 Boot2Docker : brew install boot2docker .
  2. Boot2Docker を実行しますが、VirtualBox の共有フォルダーは無効にしてください。 boot2docker init && boot2docker start --vbox-share=disable .
  3. 実行 boot2docker shellinit を実行し、出力された環境変数をあなたの ~/.bash_profile ファイルにコピーします。
  4. Boot2DockerのVMにrsyncをインストールします。 boot2docker ssh "tce-load -wi rsync" .
  5. Boot2Docker VM に必要なベースフォルダを作成し、それらに正しいパーミッションを設定します。例えば、同期するために /foo/bar フォルダーを OS X から同期する場合、次のように作成する必要があります。 /foo/bar をBoot2DockerのVM上に作成します。 boot2docker ssh "mkdir -p /foo/bar && chown -R docker /foo/bar" .
  6. rsyncを実行して、ファイルをBoot2Docker VMに同期させます。 rsync --archive --rsh="ssh -i $HOME/.ssh/id_boot2docker -o StrictHostKeyChecking=no" /foo/bar docker@dockerhost:/foo . rsync のドキュメントをチェックして、有効にしたい様々な設定、例えば --exclude .git を除外するために .git フォルダを同期時に除外します。
  7. ファイルウォッチャーを使用して、ファイルの同期を維持します。例えば fswatch ( brew install fswatch ) を rsync にパイプします。
  8. この時点では docker run を使って Docker コンテナを起動し、その中で -v フラグを使用して、同期するフォルダをマウントします。 docker run -v /foo/bar:/src some-docker-image .
  9. 通常通り OS X 上でコードを更新します。変更は rsync を使って非常に速く伝搬し、通常のファイルウォッチャーコードは通常通り変更をピックアップするはずです (つまり inotify を使用して)、そしてすべてのファイルがコンテナーに対して "local" であるため、ビルドは高速に実行されるはずです。
  10. 実行中のウェブサイトをテストする必要がある場合、コンテナ内で boot2docker ip コマンドを実行して、それがどの IP にあるのかを調べます。