Там, где я работаю, мы пробовали два решения проблемы медленной работы Vagrant + Symfony. Рекомендую второй (nfs и bind mounts).
Подход rsync
Для начала мы использовали rsync. Наш подход немного отличался от изложенного в ответе AdrienBrault. Скорее, у нас был такой код в нашем Vagrantfile
:
config.vm.define :myproj01 do |myproj|
# Networking & Port Forwarding
myproj.vm.network :private_network, type: "dhcp"
# NFS Share
myproj.vm.synced_folder ".", "/home/vagrant/current", type: 'rsync', rsync__exclude: [
"/.git/",
"/vendor/",
"/app/cache/",
"/app/logs/",
"/app/uploads/",
"/app/downloads/",
"/app/bootstrap.php.cache",
"/app/var",
"/app/config/parameters.yml",
"/composer.phar",
"/web/bundles",
"/web/uploads",
"/bin/behat",
"/bin/doctrine*",
"/bin/phpunit",
"/bin/webunit",
]
# update VM sooner after files changed
# see https://github.com/smerrill/vagrant-gatling-rsync#working-with-this-plugin
config.gatling.latency = 0.5
end
Как вы могли заметить из приведенного выше, мы синхронизировали файлы с помощью плагина Vagrant gatling rsync.
Улучшенный подход NFS с использованием привязки (рекомендуемое решение)
Подход rsync решает проблему скорости, но мы обнаружили некоторые проблемы с ним. В частности, его односторонний характер (в отличие от совместного использования папок) раздражал, когда файлы (такие как composer.lock
или миграции Doctrine) генерировались на виртуальной машине или когда мы хотели получить доступ к коду в /vendor
. Нам пришлось использовать SFTP, чтобы скопировать все обратно, а в случае с новыми файлами сделать это до того, как они будут очищены при следующем запуске плагина гатлинга!
Поэтому мы перешли к решению, которое использует привязку монтирования к обрабатывать папки, такие как кеш и журналы, по-разному. Отсутствие того, что они были разделены, резко увеличило скорость.
Соответствующие биты Vagrantfile следующие:
# Binding mounts for folders with dynamic data in them
# This must happen before provisioning, and on every subsequent reboot, hence run: "always"
config.vm.provision "shell",
inline: "/home/vagrant/current/bin/bind-mounts",
run: "always"
Упомянутый выше сценарий bind-mounts
выглядит следующим образом:
#!/bin/bash
mkdir -p ~vagrant/current/app/downloads/
mkdir -p ~vagrant/current/app/uploads/
mkdir -p ~vagrant/current/app/var/
mkdir -p ~vagrant/current/app/cache/
mkdir -p ~vagrant/current/app/logs/
mkdir -p ~vagrant/shared/app/downloads/
mkdir -p ~vagrant/shared/app/uploads/
mkdir -p ~vagrant/shared/app/var/
mkdir -p ~vagrant/shared/app/cache/
mkdir -p ~vagrant/shared/app/logs/
sudo mount -o bind ~vagrant/shared/app/downloads/ ~/current/app/downloads/
sudo mount -o bind ~vagrant/shared/app/uploads/ ~/current/app/uploads/
sudo mount -o bind ~vagrant/shared/app/var/ ~/current/app/var/
sudo mount -o bind ~vagrant/shared/app/cache/ ~/current/app/cache/
sudo mount -o bind ~vagrant/shared/app/logs/ ~/current/app/logs/
Я бы порекомендовал подход с привязкой NFS +.
person
Sam
schedule
08.10.2014