如何使用 Vagrant 配置來安裝包而不下載?
我將 Vagrant 盒子用於多種目的,在大多數情況下,我可以下載的準備好的盒子就足夠了。然而,有時我需要在盒子上安裝一個或幾個額外的軟體包——用於正常活動,而不是一次性使用。
例如,我的 Mac 上有一個 Vagrant 盒子(Mac 主機上的 Linux 來賓),我主要希望它可以輕鬆訪問內置的 Linux 文件(
man
頁面、info
頁面等)。但是,我使用的盒子沒有man
我第一次安裝的包vagrant up
。如果我只是手動安裝包,它只會持續到下一個
vagrant destroy
. 如果我vagrant halt
改用它,我會在我的系統上建立 cruft,這違背了使用的目的,vagrant
而不是簡單的 Virtual Box。我知道對此的一般答案是 vagrant Provisioning,它可以像帶有單個命令的腳本一樣簡單
sudo yum install man
。(雖然實際上我什至不知道具體該怎麼做。)但是,我不想每次啟動 vagrant box 時都下載 man 包和所有依賴項,我寧願下載這些包一次,將它們儲存在我的主機系統上,並在每次 I 時將它們載入到 vmvagrant 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
我剛剛又遇到了這個案例;我將在這裡簡要記錄我是如何處理它的。
我想下載(但不安裝)Git 和 PostgreSQL,然後在 vagrant 提供過程中安裝它們。
我使用來自新 VM 的以下命令來下載具有所有依賴項的包(在 之後
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 配置命令添加到我的
Vagrantfile
:config.vm.provision "shell", inline: <<-SHELL yum install -C -y /vagrant/packages/* SHELL
…我已經安裝了 Git 和 PostgreSQL 並準備好在 any 之後使用
vagrant up
,即使vagrant destroy
已經執行。
例如,我的 Mac 上有一個 Vagrant 盒子(Mac 主機上的 Linux 來賓)
知道這是哪個發行版會很有趣…鑑於您正在嘗試使用
yum
我想這是一些 RH/CentOS/.. 的東西?我主要是想輕鬆訪問內置的 Linux 文件(手冊頁、資訊頁等)。但是,當我第一次 vagrant up 時,我使用的盒子沒有安裝 man 包。
man
我不知道預設情況下不安裝的任何發行版。如果我是你,我會使用 ATLAS 上的官方盒子之一,我會想到 Debian:https ://vagrantcloud.com/debian/
回复 Q1
將此添加到您的 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
.回复 Q2
我是 Debian 使用者,因此是 RedHat 文盲 ;-)
恕我直言,這將是
rpm -hiv <filename>
(i
=install,h
= hashmarks,v
= verbose)。