Vagrant chicken-and-egg:与uid = apache用户共享的文件夹

Ale*_*lex 40 linux apache vagrant

我的Vagrant盒子是从基础linux(科学linux)构建的,在配置期间(使用shell脚本)安装了Apache.

我最近将Vagrant文​​件(v2)更改为:

config.vm.synced_folder "public", "/var/www/sites.d/example.com",
   :owner => "apache", :group => "apache"
Run Code Online (Sandbox Code Playgroud)

如果已经配置了盒子并且刚刚重新启动,那么哪个效果很好.

现在,在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
Run Code Online (Sandbox Code Playgroud)

这很清楚 - 在初始运行期间,还没有安装apache.

一个丑陋的解决方法当然是使用已synced_folder注释掉的基本配置,对其进行注释然后重新启动.

有没有什么干净的技巧来解决这个问题?特别是在vagrant up总是没有中断的情况下运行,即使盒子是新的.

Sea*_*ton 26

如果您可以修复uid/gid值,可以在mount命令中使用它们 - 它们不必与现有用户/组相关

我这样做是为了一个用户,后来由puppet使用固定(匹配)的uid/gid值创建

config.vm.synced_folder "foo", "/var/www/foo",
   id: "foo", :mount_options => ["uid=510,gid=510"]
Run Code Online (Sandbox Code Playgroud)

  • 对于rsync而不是使用mount_options,您将使用选项`owner:1000`,`group:1000` (2认同)
  • 你如何告诉Apache安装什么uid和gid用于apache用户和组? (2认同)

小智 9

这就是我做的:

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
Run Code Online (Sandbox Code Playgroud)

而不是使用用户名和组(作为文本)使用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
Run Code Online (Sandbox Code Playgroud)

id命令无法识别用户.因此,切换到uid和gid命令id将不会被vagrant使用.

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

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

vagrant up; vagrant provision; vagrant reload
Run Code Online (Sandbox Code Playgroud)

但是,它既不干净又不干净.


Mar*_*lte 8

Ryan Sechrest已经广泛处理了这个问题.

提出的解决方案之一是:

将目录的权限设置为777,将文件设置为666

config.vm.synced_folder "/Users/ryansechrest/Projects/Sites", 
  "/var/www/domains", mount_options: ["dmode=777", "fmode=666"]
Run Code Online (Sandbox Code Playgroud)