为什么 Windows 上 Ubuntu Docker 容器中的 Vagrant 会寻找 PowerShell?

为什么 Windows 上 Ubuntu Docker 容器中的 Vagrant 会寻找 PowerShell?

我正在接受一些培训,其中所有示例都在 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 安装成功,我可以启动新的 PowerShell,但出现相同的错误消息。

看起来 Docker Ubuntu 中的 Vagrant 正在寻找 Windows 安装。我的 Vagrant 文件中没有任何内容涉及 Powershell。

Vagrant 是否以这种方式支持,在 PowerShell 中的 Windows 上的 Ubuntu Docker 容器中运行?

答案1

Vagrant 正在从 Linux 启动 Windows 可执行文件。如果 Linux 在 Windows 主机下作为 Windows Subsystem for Linux (WSL/WSL2) 或 Docker 容器运行,Vagrant 将寻找适用于 Windows 的 PowerShell 可执行文件(.exe 文件)。

您只需将 Powershell 的路径添加到 Linux 下的 PATH 环境变量中即可。例如,如果C:Linux 上的 Windows 驱动器安装为/mnt/c,请添加以下 PATH 变量。

export PATH="$PATH:/mnt/c/Windows/System32/WindowsPowerShell/v1.0"

您可以将上述行添加到您的~/.profile文件中,然后使用以下命令重新加载它:

nano ~/.profile
source ~/.profile

这样,Vagrant 就可以启动了。

通过环境变量VAGRANT_WSL_ENABLE_WINDOWS_ACCESS,Vagrant 了解到它可以访问 Windows 系统来运行可执行文件并使用同步文件夹等功能。因此,你可能还需要添加以下变量:

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 之间的通信。

答案2

再说一次,我从未听说过 Vagrant,但快速搜索 Vagrant 网站,解释了它的 PowerShell 集成和用例。即

命令:vagrant powershell

https://www.vagrantup.com/docs/cli/powershell

# Command: 

vagrant powershell
<#
This will open a PowerShell prompt on the host into a running Vagrant guest machine.

This command will only work if the machines supports PowerShell. Not every environment will support PowerShell. At the moment, only Windows is supported with this command.
#>

也可以看看:

在 Vagrant 中运行 PowerShell

使用 Vagrant、Hyper-V 和 Docker-Machine 创建和配置本地虚拟机

相关内容