2013-07-31 84 views
36

我的流浪者箱是基于Linux(科学linux)构建的,在供应期间(使用shell脚本),安装了Apache。流浪鸡与鸡蛋:与uid = apache用户共享文件夹

我最近改变了流浪文件(V2)到:

config.vm.synced_folder "public", "/var/www/sites.d/example.com", 
    :owner => "apache", :group => "apache" 

如果框已提供,只是重新启动,效果很好。

现在,vagrant destroy && vagrant up后,我得到的错误:

mount -t vboxsf -o uid=`id -u apache`,gid=`id -g apache` 
    /var/www/sites.d/example.com /var/www/sites.d/example.com 
id: apache: User does not exist 

这是明确的 - 作为初始运行期间,Apache是​​尚未安装。

一个丑陋的解决方法当然是做基本配置与synced_folder注释掉,评论它,然后重新启动。

有没有什么干净的伎俩来解决这个问题?尤其是以一种vagrant up始终无间断运行的方式,即使箱子是新的。

+1

你如何安装Apache?一种选择是使用用户vagrant创建同步文件夹,然后在供应脚本/食谱等中更改所有者。 Apache安装完成后。 – pauljm

+0

Apache通过yum安装。文档根目录是一个共享文件夹。我不确定如果我更改此文件夹的所有者会发生什么情况 - >还会更改主机系统中共享文件夹的所有者?但基本上流浪者在安装时强制执行用户,我认为不可行(但没有尝试) – Alex

+0

我不认为更改guest文件夹的所有权会影响主机文件夹的权限(请参阅http://stackoverflow.com/问题/ 13566201 /可-I - 修改 - 的所有权换一个共享文件夹合流浪)。我的假设是,主机文件夹获取用户作为其所有者运行vagrant。如果它确实尝试在来宾和主机之间同步所有者,则会出现严重问题,因为主机拥有与来宾不同的一组用户。我认为在安装apache之后更改所有者将起作用。 – pauljm

回答

7

Ryan Sechrestdealt extensively with this problem

其中提出的解决方案是:

Set permissions of directories to 777 and files to 666

config.vm.synced_folder "/Users/ryansechrest/Projects/Sites", 
    "/var/www/domains", mount_options: ["dmode=777", "fmode=666"] 
+0

config.vm.synced_folder“。”,“/ var/www/website”,id:“webroot”,:owner =>“4444”,:group =>“4444”对我来说效果更好,这会使vboxsf共享用uid/gid创建卷,然后在提供期间创建一个具有相同用户的用户 –

2

我如何解决这个问题,我首先将共享配置为Vagrantfile,没有用户或组信息。然后在配置阶段,我卸载共享并重新安装正确的用户和组信息。例如: -

exec { 
'umount /share/location': 
    command => 'umount /share/location'; 
} -> exec { 
'mount /share/location': 
    command => 'mount -t vboxsf -o uid=`id -u apache`,gid=`id -g apache` /share/name /share/location' 

您可以检查从VirtualBox或通过运行与调试标志和非工作设置配置共享名称(它打印出的实际mount命令)。我知道这是有点解决方法,可能不适用于任何情况,但它对我有用。

+0

配置虚拟机后重新引导虚拟机是否有效? – Alex

+0

@亚历是的。尽管它取决于其余的配置。 – kontulai

25

如果你能解决,你可以在mount命令中使用这些的UID/GID值 - 他们没有涉及到现有的用户/组

我这样做与以后通过创建用户使用傀儡固定(匹配)UID/GID值

config.vm.synced_folder "foo", "/var/www/foo", 
    id: "foo", :mount_options => ["uid=510,gid=510"] 
+0

我使用* 1000 *的'uid/gid'创建了一个'kevin'用户:'$ cat/etc/passwd | grep kevin' .... 'kevin:x:1000:1000 ::/home/kevin:/ bin/bash ',但将此条目添加到我的'.kitchen.yml'不起作用 - '[“c :/ dev/share“,”/ path/to/share“,”create:true“,”type:rsync“,”mount_options:[uid = 1000]“]'。 '/ path/to/share'目录仍然属于'vagrant' –

+2

对于rsync而不是使用mount_options,你可以使用选项'owner:1000','group:1000' – littleforest

+2

你如何告诉Apache安装什么? uid和gid用于apache用户和组? –

8

这是我做过什么:

config.vm.synced_folder "./MyApp", "/opt/MyApp", owner: 10002, group: 1007, create: true 

config.vm.provision :shell do |shell| 
    shell.inline = "groupadd -g 1007 myapp; 
        useradd -c 'MyApp User' -d /opt/MyApp -g myapp -m -u 10002 myapp;" 
end 

而是使用用户名和组(如文本)的使用的UID和GID。然后用这些ID创建组和用户。这是因为错误实际上是:

mount -t vboxsf -o uid=`id -u myapp`,gid=`getent group myapp | cut -d: -f3` opt_MyApp /opt/MyApp 
... 
id: myapp: No such user 

id命令无法识别用户。所以,切换到uid和gid的命令ID将不会被流浪者使用。

我用这种方法得到的唯一警告是用户主目录(/ opt/MyApp)已经存在,但我可以忍受,或者可以更改useradd命令忽略主目录(如果已存在)。

在此之前,我用的解决方法是:

vagrant up; vagrant provision; vagrant reload 

但是,这不是很好也不干净。