DockerとBoot2Dockerを使用してOS Xで開発環境をセットアップする良い方法がわかりません。私が当たっている問題は、ソースコードをどのように管理するかです:
理論的には、これはソースコードをボリュームとしてマウントすることで簡単に実行できるはずです。
docker run -it -v /path/to/my/source/code:/src some-docker-image
残念ながら、これにはOS Xで完全に使用できなくなる2つの大きな問題があります。
たとえば、ソースコードがDockerイメージの一部である場合、Jekyllが homepage をコンパイルするのにかかる時間は次のとおりです。
> 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
SBT、Jekyll、およびgruntのデフォルトの監視メカニズムは、inotifyなどのテクノロジーを使用します。これらは、Dockerコンテナーで実行され、OS Xでマウントされたフォルダーに変更が加えられると機能しません。
ソリューション(SO上のすべてを含む)を検索し、それらのいくつかを試してみましたが、成功したものは見つかりませんでした。
DockerとOS Xでコードを生産的に開発し、実際に機能するソリューションを見つけた人はいますか?
最終的に、Boot2Docker + rsyncを使用することで生産性が高いと思われるソリューションを見つけました。 my own answer と docker-osx-dev と呼ばれるオープンソースプロジェクトでこれを設定する方法の詳細をキャプチャしました。
私はこれまでに見つけた最良の解決策に自分の答えを追加することにしました。より良いオプションが見つかったら、これを更新します。
OS XでDockerを使用して生産的な開発環境をセットアップするために見つけた最良のソリューションは、Boot2Docker + Rsyncです。 rsyncを使用すると、Dockerコンテナでのビルド時間は、OSXで直接ビルドを実行した場合と同等です。さらに、File Watcherコードはnotポーリングを必要としません(inotify
はrsyncが通常のフォルダーを使用するため機能します)。したがって、ホットリロードはalmost速い。
セットアップには、自動インストールと手動インストールの2つの方法があります。
R2でBoot2Dockerをセットアップするためのすべてのステップを、 docker-osx-dev と呼ばれるオープンソースプロジェクトにパッケージ化しました。コードは少し荒いですが、3種類の異なる技術スタックを持つ3つのプロジェクト間を簡単に切り替えるために、数週間にわたって正常に使用しています。それを試して、バグを報告し、いくつかのPRを提出してください!また、私のブログ投稿 OS XでのDockerを使用した生産的な開発環境 を参照してください。
brew install boot2docker
。boot2docker init && boot2docker start --vbox-share=disable
。boot2docker shellinit
を実行し、印刷される環境変数を~/.bash_profile
ファイルにコピーします。boot2docker ssh "tce-load -wi rsync"
。/foo/bar
フォルダーを同期する場合、作成する必要があります/foo/bar
Boot2Docker VMの場合:boot2docker ssh "mkdir -p /foo/bar && chown -R docker /foo/bar"
。rsync --archive --rsh="ssh -i $HOME/.ssh/id_boot2docker -o StrictHostKeyChecking=no" /foo/bar docker@dockerhost:/foo
。同期時に--exclude .git
フォルダーを除外するために.git
を使用するなど、有効にすることができるさまざまな設定については、rsyncのドキュメントを確認してください。brew install fswatch
)を使用できます。docker run
を使用してDockerコンテナーを起動し、-v
フラグを使用して、同期しているフォルダーをマウントできます:docker run -v /foo/bar:/src some-docker-image
。inotify
を使用して)変更を取得し、すべてのファイルがコンテナに対して「ローカル」であるためビルドを高速に実行する必要があります。boot2docker ip
コマンドを実行して、どのIP上にあるかを確認してください。Update:現在、 mac用のdocker は非ハック機能を備えたベータ版であるため、そのルートを使用する方がはるかに合理的ですエッセイのようなハッキングや回避策のないローカル開発向け。
しないでください。私はそれがあなたがおそらく望んでいる答えではないことを知っていますが、OSXでローカル開発を行うのではなく、ローカルソースコード+ Docker化された実行を取得することのコスト/メリットを正直に評価してください。
ある時点で、すべての問題、セットアップの労力、および運用上の問題点が十分に解決される可能性がありますが、現時点での私の考えでは、これは純損失です。
問題#1:Virtual Box(vboxfsを使用)にマウントされたボリュームが非常に遅い
しばらく待つと、ほぼ確実に改善されます。
問題#2:ファイルの監視が壊れている
これに対する修正が近い将来にあるかどうかはわかりません。このタイプの機能が開発ワークフローの鍵である場合、私はこれを取り壊しと見なします。 rbenv/bundlerを使用してjekyll/Rubyのインストールを管理し、OSXでローカルに実行するのに比べて、過去10年以上にわたって成功しているのと比較すると、大きなR&D努力の価値はありません。
「クラウド」が私のローカル開発のセットアップに関与していないように、現時点では、Dockerはテスト/ステージング/展開、およびデータベースや他のサードパーティコンポーネントの実行に適していますが、実際にコーディングしているアプリケーションはまっすぐに実行されますOSXで。
MacおよびWindows用のDockerは、OS X(およびWindows)でDockerを使用して開発する決定的な方法です)。 Docker製品であるこのソフトウェアは、「MacまたはWindowsからアプリケーションを構築、アセンブル、および出荷するための統合された展開しやすい環境」です。OPが提示する問題を解決できるとされています。 2016年3月24日発表 :
免責事項:私はdocker-syncの作者なので、偏見があるかもしれません。
私はおそらくここを含むすべてのソリューションを試してみましたが、さらにいくつかを比較します(比較を参照してください https://github.com/EugenMayer/docker-sync/wiki/Alternatives-to-docker-sync )基本的には、パフォーマンスの側面(ほとんどの場合)またはドッカーマシン(またはなし)で使用/強制が失敗しました。
http://docker-sync.io は、すべてのソリューションをマージし、最良の戦略を提供するために構築されています(いくつか実装し、選択できます)。
ユーザーのアクセス許可の修正を含むrsync(1方向同期)およびunison(2方向同期)で使用できます。強制的にdocker-machineや特定のハイパーバイザーを使用したり、Mac用のdockerを用意する必要はありません。それらのすべてで動作します。
EugenMayer/docker-sync/wiki/4のパフォーマンスは影響を受けません。まったく共有されていないようです。
docker-syncとそのchange-watcherは最適化されており、問題なく12kファイルのプロジェクトで動作します。
あなたが好きなら、それを試してみてください、私はフィードバックを聞きたいです!
VagrantとParallelsおよびboot2dockerも使用しています( https://github.com/Parallels/boot2docker-vagrant-box )。私にとって開発は決して簡単ではありませんでした。 docker-compose
および大規模なセットアップ。遅延や大量のリソース消費はあまり感じません。
これは私のVagrantfile
のようです:
Vagrant.configure(2) do |config|
config.vm.network "private_network", ip: "192.168.33.10"
config.vm.box = "parallels/boot2docker"
config.vm.synced_folder "/Users", "/Users", type: "nfs", mount_options: ["nolock", "vers=3", "udp"], id: "nfs-sync"
end
君の気持ち、分かるよ!私はあなたが試したことのほとんどすべてを試しましたが、残念ながらまだ遅いと思います。次に、このコメントに出会いました https://github.com/boot2docker/boot2docker/issues/64#issuecomment-70689254 これは、Virtualboxの代わりにVagrantとParallelsを使用することを示唆しています。これにより、nfsを使用できるようになり、実際に私のプロジェクト(Drupal)のパフォーマンスが大幅に向上しました。
Vagrantファイルは次のとおりです。必要なのは、vagrantをインストールし、これをVagrantfileというファイルにコピーして、いくつかのフォルダーに入れることだけです。そのフォルダーに移動して、vagrant up
通常のboot2dockerの代わりに。
Vagrant.configure(2) do |config|
config.vm.box = "parallels/boot2docker"
config.vm.network "forwarded_port", guest: 80, Host: 80
config.vm.synced_folder(
"/Users/dicix/work/www", "/vagrant",
type: 'nfs',
nfs_udp: true,
mount_options: %w[actimeo=2],
bsd__nfs_options: %w[alldirs maproot=root:wheel]
)
end
OS X(2011年中期Macbook Air)+ Boot2Docker + Docker-compose環境で数週間開発を続けてきました。重大なパフォーマンスの問題に遭遇したことはありませんが、開発中にビルドを実行することは避けます(なぜjekyll serve --skip-initial-build
?)。次に例を示しますdocker-compose.yml
使用しているファイル:
docker-compose.yml:
test:
build: .
volumes:
- ./client:/src/client
- ./server:/src/server
- ./test:/src/test
command: nodemon --exec jasmine-node -- test/ --verbose --autotest --captureExceptions --color
environment:
- DEBUG=*
Dockerfile:
FROM node:0.12
RUN mkdir -p /src
WORKDIR /src
ENV PATH=/src/node_modules/.bin:$PATH
# We add package.json first so that we the
# image build can use the cache as long as the
# contents of package.json hasn't changed.
COPY package.json /src/
RUN npm install --unsafe-perm
COPY . /src
CMD [ "npm", "start" ]
EXPOSE 3000
私は時々NFSを使用します( http://syskall.com/using-boot2docker-using-nfs-instead-of-vboxsf/ )が、そうするときの大きなパフォーマンスの違いに気付いていません。
私にとっては、シンプルなdocker-compose up test
環境を稼働させるには、パフォーマンスのコストに見合うだけの価値があります(スタックが異なる複数のプロジェクトで日常的に作業しています)。
PS:nodemon
は、vboxsfで動作する数少ないファイル監視ツールの1つです( https://github.com/remy/nodemon/issues/419 を参照)。
Docker Unisonは魅力のように機能します! https://github.com/leighmcculloch/docker-unison
非常に優れたパフォーマンスの双方向同期!