我将 Vagrant 盒子用于多种目的,在大多数情况下,我可以下载的准备好的盒子完全足够了。然而,有时我需要在盒子上安装一个或几个额外的软件包 - 用于日常活动,而不是一次性使用。
例如,我的 Mac 上有一个 Vagrant 盒子(Mac 主机上的 Linux 来宾),我主要希望能够轻松访问内置 Linux 文档(man
页面、info
页面等)。但是,我使用的盒子没有man
我第一次安装时安装的软件包vagrant up
。
如果我只是手动安装该软件包,它只会持续到下一个vagrant destroy
.如果我使用vagrant halt
它,我会在我的系统上建立一些缺陷,这违背了使用vagrant
Virtual Box 的初衷。
我知道一般的答案是 vagrant 配置,它可以像带有单个命令的脚本一样简单sudo yum install man
。 (虽然实际上我什至不知道具体该怎么做。)但是,我宁愿下载这些包,而不是每次启动 vagrant box 时下载 man 包和所有依赖项一次,将它们存储在我的主机系统上,并每次我将它们加载到虚拟机中vagrant up
。
我已经sudo yum install man --downloadonly
在来宾上运行,以获取我需要的包,并将sudo cp -r /var/cache/yum/x86_64/6/base/packages/ /vagrant/
包文件放在我的主机上。
所以我的问题实际上是双重的:
用于以下用途的 vagrant 配置语法是什么:(a) 调用脚本(与 Vagrantfile 存储在同一目录中),或 (b) 如果可能,在 Vagrantfile 中嵌入单个命令(例如
sudo yum install man
)?如何提供
yum
从本地目录安装软件包所需的选项标志 (/vagrant
)和从同一本地目录而不是从在线存储库安装任何所需的依赖项?
答案1
例如,我的 Mac 上有一个 Vagrant 盒子(Mac 主机上的 Linux 客户机)
知道这是哪个发行版会很有趣...鉴于您正在尝试使用yum
我想这是一些 RH/CentOS/.. 的东西?
我主要希望能够轻松访问内置的 Linux 文档(手册页、信息页等)。但是,当我第一次 vagrant up 时,我使用的盒子没有安装 man 包。
我不知道有哪个发行版是man
默认安装的。
如果我是你,我会使用 ATLAS 上的官方盒子之一,我会想到 Debian:https://vagrantcloud.com/debian/
回复问题1
将其添加到您的 vagrantfile 中:
$script = <<SCRIPT
echo I am provisioning...
date > /etc/vagrant_provisioned_at
SCRIPT
Vagrant.configure("2") do |config|
config.vm.provision "shell", inline: $script
end
示例取自 http://docs.vagrantup.com/v2/provisioning/shell.html#inline-scripts
这将执行顶部的脚本,从而创建/etc/vagrant_provisioned_at
进一步适应你的问题:
$script = <<SCRIPT
yum install man
SCRIPT
Vagrant.configure("2") do |config|
config.vm.provision "shell", inline: $script
end
配置脚本作为 UID0 运行,因此不需要sudo
.
回复问题2
我是 Debian 用户,因此对 RedHat 是文盲;-)
恕我直言,这将是rpm -hiv <filename>
(i
=安装,h
=哈希标记,v
=详细)。
答案2
我刚刚再次遇到这个用例;我在这里简单记录一下我的处理方式。
我想下载(但不安装)Git 和 PostgreSQL,然后在 vagrant 配置过程中安装它们。
我在新的虚拟机中使用以下命令来下载具有所有依赖项的软件包(在 之后sudo mkdir /vagrant/packages
):
sudo yumdownloader --destdir=/vagrant/packages/ --resolve -y git postgresql
这个命令的技巧是,它下载的东西太多了。下一步是建立我所使用的 RPM实际上安装所需的。我通过尝试做到了这一点:
sudo yum install /vagrant/packages/git-1.7.1-4.el6_7.1.x86_64.rpm /vagrant/packages/postgresql-8.4.20-6.el6.x86_64.rpm
在确认提示时按“否”,因为我可以看到它正在计划下载依赖项。我获取了列出的依赖项并将它们添加到我的命令中:
sudo yum install /vagrant/packages/git-1.7.1-4.el6_7.1.x86_64.rpm /vagrant/packages/postgresql-8.4.20-6.el6.x86_64.rpm /vagrant/packages/perl-* /vagrant/packages/postgresql-libs-8.4.20-6.el6.x86_64.rpm
这不需要下载任何东西就可以成功工作,所以我然后运行:
cd /vagrant/packages/
mkdir save
mv /vagrant/packages/git-1.7.1-4.el6_7.1.x86_64.rpm /vagrant/packages/postgresql-8.4.20-6.el6.x86_64.rpm /vagrant/packages/perl-* /vagrant/packages/postgresql-libs-8.4.20-6.el6.x86_64.rpm save/
rm *.rpm
mv save/* .
rmdir save
结果:“packages”目录仅有的新鲜 Vagrant 镜像中实际需要的依赖项。
然后将 shell 配置命令添加到 my Vagrantfile
:
config.vm.provision "shell", inline: <<-SHELL
yum install -C -y /vagrant/packages/*
SHELL
...我已经安装了 Git 和 PostgreSQL,并且可以在任何之后使用vagrant up
,即使vagrant destroy
已运行。