web-dev-qa-db-fra.com

Comment déboguer le message "Vagrant ne peut pas transférer les ports spécifiés sur cette machine virtuelle"

J'essaie de démarrer une instance Vagrant et de recevoir le message suivant:

Vagrant cannot forward the specified ports on this VM, since they
would collide with another VirtualBox virtual machine's forwarded
ports! The forwarded port to 4567 is already in use on the Host
machine.

To fix this, modify your current projects Vagrantfile to use another
port. Example, where '1234' would be replaced by a unique Host port:

  config.vm.forward_port 80, 1234

J'ai ouvert VirtualBox, mais je n'ai pas de box en cours d'exécution pour le moment, alors je suis perplexe. Comment savoir quel processus écoute sur 4567? Est-il possible de répertorier toutes les boîtes Vagrant en cours d'exécution sur ma machine? 

Merci, Kevin.

40
Kevin Burke

Comme le message l'indique, le port entre en collision avec la zone Host. Je voudrais simplement changer le port pour une autre valeur sur la machine hôte. Donc, si je reçois une erreur pour

config.vm.forward_port 80, 1234

alors je changerais pour 

config.vm.forward_port 80, 5656

Comme 1234 pourrait être utilisé sur mon ordinateur hôte. 

Pour inspecter les ports de n’importe quel ordinateur, j’utilise l’utilitaire tcpview correspondant à ce système d’exploitation et je découvre le port utilisé.

13
Vishal Biyani

Vous pouvez voir quelles instances vagrant sont en cours d'exécution sur votre machine en exécutant

$ vagrant global-status
id       name    provider   state   directory
----------------------------------------------------------------------
a20a0aa  default virtualbox saved   /Users/dude/Downloads/inst-MacOSX
64bc939  default virtualbox saved   /Users/dude/svn/dev-vms/ubuntu14
a94fb0a  default virtualbox running /Users/dude/svn/dev-vms/centos5

Si vous ne voyez aucune machine virtuelle en marche, votre conflit n'est pas une boîte de vagabond (que vagabond sait). La prochaine étape consiste à lancer l'interface utilisateur de VirtualBox et à vérifier si des instances sont en cours d'exécution. Si vous ne voulez pas exécuter l'interface utilisateur, vous pouvez:

ps -ef |grep VBox

Si des instances de VirtualBox sont en cours d'exécution, elles doivent être incluses dans cette sortie. Vous devriez être capable de simplement tuer les processus qui ont VirtualBox dans leur sortie. L’un des problèmes est qu’un de ces processus semble exister pour garder les vivantes. Juste tuer le processus le plus élevé de VirtualBox. Si vous avez une image VirtualBox en cours d'exécution sans que vagrant ne le sache, il se peut que certains répertoires Vagrant aient été supprimés manuellement, ce qui signifie que Vagrant perd le suivi de l'instance. 

60
bikeonastick

Attention, votre Vagrantfile est pas le seul utilisé pour faire apparaître une boîte/instance Vagrant.

Quand vous obtenez ceci:

~/dev/vagrant user$ vagrant reload
Vagrant cannot forward the specified ports on this VM, since they
would collide with some other application that is already listening
on these ports. The forwarded port to 8001 is already in use
on the Host machine.

To fix this, modify your current projects Vagrantfile to use another
port. Example, where '1234' would be replaced by a unique Host port:

  config.vm.network :forwarded_port, guest: 8001, Host: 1234

Sometimes, Vagrant will attempt to auto-correct this for you. In this
case, Vagrant was unable to. This is usually because the guest machine
is in a state which doesn't allow modifying port forwarding.
~/dev/vagrant user$ 

En fait, vous utilisez non seulement le fichier Vagrantfile de ~/dev/vagrant, mais également celui de votre fichier .box de distribution "box" qui se trouve généralement ici:

~/.vagrant.d/boxes/trusty/0/virtualbox/Vagrantfile

Et si vous y jetez un coup d’œil, vous verrez qu’il contient de nombreux mappages default port:

$ cat ~/.vagrant.d/boxes//trusty/0/virtualbox/Vagrantfile
$script = <<SCRIPT
bzr branch lp:jujuredirector/quickstart /tmp/jujuredir
bash /tmp/jujuredir/setup-juju.sh
SCRIPT

Vagrant.configure("2") do |config|
  # This Vagrantfile is auto-generated by 'vagrant package' to contain
  # the MAC address of the box. Custom configuration should be placed in
  # the actual 'Vagrantfile' in this box.

  config.vm.base_mac = "080027DFD2C4"
  config.vm.network :forwarded_port, guest: 22, Host: 2122, Host_ip: "127.0.0.1"
  config.vm.network :forwarded_port, guest: 80, Host: 6080, Host_ip: "127.0.0.1"
  config.vm.network :forwarded_port, guest: 8001, Host: 8001, Host_ip: "127.0.0.1"
  config.vm.network "private_network", ip: "172.16.250.15"
  config.vm.provision "Shell", inline: $script

end

# Load include vagrant file if it exists after the auto-generated
# so it can override any of the settings
include_vagrantfile = File.expand_path("../include/_Vagrantfile", __FILE__)
load include_vagrantfile if File.exist?(include_vagrantfile)

Alors, continuez et éditez ce fichier pour supprimer le (s) port (s) de transfert en collision en cause:

  config.vm.network :forwarded_port, guest: 22, Host: 2122, Host_ip: "127.0.0.1"
  config.vm.network :forwarded_port, guest: 80, Host: 6080, Host_ip: "127.0.0.1"
  # config.vm.network :forwarded_port, guest: 8001, Host: 8001, Host_ip: "127.0.0.1"

Par:

~/dev/vagrant user$ cp ~/.vagrant.d/boxes//trusty/0/virtualbox/Vagrantfile ~/.vagrant.d/boxes//trusty/0/virtualbox/Vagrantfile.old
~/dev/vagrant user$ vi ~/.vagrant.d/boxes//trusty/0/virtualbox/Vagrantfile

et faites attention aux autres inclusions de Vagrantfiles:

include_vagrantfile = File.expand_path("../include/_Vagrantfile", __FILE__)

Et maintenant ça marche:

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'trusty'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: vagrant_default_1401234565101_12345
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: hostonly
==> default: Forwarding ports...
    default: 22 => 2122 (adapter 1)
    default: 80 => 6080 (adapter 1)
    default: 22 => 2222 (adapter 1)
==> default: Running 'pre-boot' VM customizations...
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Connection timeout. Retrying...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Configuring and enabling network interfaces...
==> default: Mounting shared folders...
    default: /vagrant => /Home/user/dev/vagrant/vagrant-docker
==> default: Running provisioner: Shell...
    default: Running: inline script
...

J'espère que cela t'aides.

17
Phil L.

J'ai rencontré ce problème et il s'est avéré que RubyMine tenait toujours un port. J'ai découvert quelle application était en attente sur le port (31337 dans mon cas) en exécutant cette commande:

lsof -i | grep LISTEN 

Sortie

node       1396 richard.nienaber    7u  IPv4 0xffffff802808b320      0t0  TCP *:20559 (LISTEN)
Dropbox    1404 richard.nienaber   19u  IPv4 0xffffff8029736c20      0t0  TCP *:17500 (LISTEN)
Dropbox    1404 richard.nienaber   25u  IPv4 0xffffff8027870160      0t0  TCP localhost:26165 (LISTEN)
rubymine  11668 richard.nienaber   39u  IPv6 0xffffff8024d8e700      0t0  TCP *:26162 (LISTEN)
rubymine  11668 richard.nienaber   65u  IPv6 0xffffff8020c6e440      0t0  TCP *:31337 (LISTEN)
rubymine  11668 richard.nienaber  109u  IPv6 0xffffff8024d8df80      0t0  TCP localhost:6942 (LISTEN)
rubymine  11668 richard.nienaber  216u  IPv6 0xffffff8020c6ef80      0t0  TCP localhost:63342 (LISTEN)
9
Richard Nienaber

Notez également que (dans Vagrant 1.6.4 au moins) il y a le dossier ~/.vagrant.d/data/fp-leases, avec des fichiers portant des noms tels que 8080, 8081 etc. Effacer le contenu de ce dossier m'a aidé tout à l'heure.

5
hijarian

Si vous utilisez Proxifier (ou une application similaire), essayez de le fermer en premier. C’est un problème que j’ai rencontré à cause de Proxifier sur OSX 10.9.

1
Dustin Cowles

J'ai rencontré ce problème parce que VM essayait d'exécuter Postgres et que Postgres s'exécutait sur mon ordinateur local sur le port 5432. 

Après vagrant resume, j'ai eu l'erreur:

Vagrant ne peut pas transférer les ports spécifiés sur cette machine virtuelle, car ils entrerait en collision avec une autre application qui écoute déjà sur ces ports. Le port transféré vers 5432 est déjà utilisé sur la machine hôte.

Recherchez ce qui fonctionne sur le port 5432:

o-ets-webdeveloper:portal me$ lsof -i :5432
COMMAND   PID     USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
postgres 1389     me    5u  IPv6 0x681a62dc601cf1e3      0t0  TCP localhost:postgresql (LISTEN)
postgres 1389     me    6u  IPv4 0x681a62dc6499362b      0t0  TCP localhost:postgresql (LISTEN)

Il s'avère que c'est un Postgres local, tuer ces processus m'a permis d'exécuter vagrant resume avec succès.

0
inostia

Je l'ai corrigé de cette façon:

  1. vagrant suspend
  2. Fermer le projet sur l'EDI RubyMine
  3. vagrant resume
  4. Ouvrir récent sur l'EDI RubyMine
0
Is Ma

Mon observation: Aucun processus n’exécutant sur le port 8000, le transfert de port ne fonctionnait donc pas. Correction: La réponse de Phil fournit une solution

~/.vagrant.d/boxes/ 

Le chemin ci-dessus contenait d'autres versions de fichiers vagrant répertoriant le port 8000. Une fois que je les ai toutes élaguées à l'aide de la commande ci-dessous, j'ai réussi à exécuter vagrant

vagrant box remove [name] --all
0
VeeKay