我正在接受一些培训,其中所有示例都在 Ubuntu 中,但我使用的是 Windows。
所以我想我会安装一个 Ubuntu Docker 容器,而且一切顺利。
这些示例还要求在 Ubuntu 中安装 VirtualBox 和 Vagrant,因此我将它们安装在我的 Ubuntu 容器中,并且一切正常。
但是,当我vagrant up
从 Ubuntu docker 容器(在 PowerShell 中运行)运行时,出现错误:
无法在可用 PATH 上找到 PowerShell 可执行文件。请确保 PowerShell 已安装且在本地 PATH 上可用,然后再次运行该命令。
我已尝试按照此处的说明为 Ubuntu 20.04(我的版本)安装 PowerShell:https://docs.microsoft.com/en-us/powershell/scripting/install/installing-powershell-core-on-linux?view=powershell-7.1安装成功,但是出现同样的错误信息。
看起来 Docker Ubuntu 中的 Vagrant 正在寻找 Windows 安装。我的 Vagrant 文件中没有任何内容涉及 Powershell。
Vagrant 是否以这种方式支持,在 PowerShell 中的 Windows 上的 Ubuntu Docker 容器中运行?
答案1
Vagrant 直接从 Linux 启动 Windows 可执行文件。如果 Linux 作为 Windows Subsystem for Linux (WSL/WSL2) 或 Windows 主机下的 Docker 容器运行,则 Linux 中的 Vagrant 将在 Windows 中查找 PowerShell 可执行文件 powershell.exe。您只需将 PowerShell 的路径添加到 Linux 下的 PATH 环境变量中。例如,如果您将 Windows 驱动器挂载C:
为/mnt/c
Linux,请添加以下 PATH 变量:
export PATH="$PATH:/mnt/c/Windows/System32/WindowsPowerShell/v1.0"
您可以将上述行添加到您的~/.profile
文件中,然后使用以下命令重新加载它:
nano ~/.profile
source ~/.profile
这样,Vagrant 就可以启动了。
通过环境变量VAGRANT_WSL_ENABLE_WINDOWS_ACCESS
,Vagrant 知道它可以访问 Windows 系统来运行可执行文件并使用同步文件夹等功能。您可以在Vagrant 官方网站的相应页面。因此,您可能还需要添加以下变量:
export VAGRANT_WSL_ENABLE_WINDOWS_ACCESS="1"
使用此变量,Vagrant 将从 Linux 启动 Windows 可执行文件,包括 Windowscmd.exe
命令行解释器。因此,您还需要将路径添加到cmd.exe
:
export PATH="$PATH:/mnt/c/Windows/System32"
否则,您将收到以下错误。
The executable 'cmd.exe' Vagrant is trying to run was not
found in the PATH variable. This is an error. Please verify
this software is installed and on the path.
如果你使用安装在 Windows Host 中的 VirtualBox,你还需要添加它的路径:
export PATH="$PATH:/mnt/c/Program Files/Oracle/VirtualBox"
由于 WSL 下的 Linux 在虚拟机中运行,因此您将无法运行 Linux 的虚拟机管理程序(如 VirtualBox),该虚拟机管理程序可以在 WSL 下运行。因此,Linux 上的 Vagrant 将使用安装在 Windows 主机上的 VirtualBox。
请确保您使用的是最新版本的 Vagrant,或者至少是 2.2.15,否则可能无法正确从 Linux 运行 Windows 可执行文件。无论如何,从 Linux 运行 Vagrant 在 Windows VirtualBox 中创建虚拟机并不总是顺利的,您可能会收到如下错误:
There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.
Command: ["startvm", "a1d5c124-261b-4e4b-a11a-88f7bfdda6df", "--type", "headless"]
Stderr: VBoxManage.exe: error: Failed to get device handle and/or partition ID for
0000000001cf34e0 (hPartitionDevice=0000000000000a39, Last=0xc0000002/1)
(VERR_NEM_VM_CREATE_FAILED)
VBoxManage.exe: error: Details: code E_FAIL (0x80004005), component ConsoleWrap, interface IConsole
为了避免这些错误并使 Vagrant 可靠地工作,只需在物理硬件下运行 Linux,而不是从 WSL 或 Windows 下的 docker 容器运行。在这种情况下,VirtualBox 也将从 Linux 运行,并且 Vagrant 不需要通过在 Linux 上运行 Windows 可执行文件来实现 Linux 和 Windows 之间的通信。
有一个YouTube 视频介绍如何在适用于 Windows 10 和 VirtualBox 的 WSL1 中的 Ubuntu 18 下安装 Vagrant。但由于此视频演示了使用较旧的软件,较新的软件可能无法按视频中所述工作。您可以使用--debug
命令行选项运行 Vagrant 来找出问题所在,但这并不总是有助于找到解决方案。以下是使用调试输出运行 Vagrant 的示例:
vagrant --debug up