Vagrant:config.vm.provision 不允许我将文件复制到 etc/nginx/conf.d?

问题描述 投票:0回答:2

我正在使用 Nginx 服务器。 我想使用 Vagrantfile 将配置文件复制到 /etc/nginx/conf.d 。 我使用的命令是:

config.vm.provision "file", source: "./bolt.local.conf", destination: "/etc/nginx/conf.d/bolt.local.conf"

我收到的错误是:

Failed to upload a file to the guest VM via SCP due to a permissions
error. This is normally because the SSH user doesn't have permission
to write to the destination location. Alternately, the user running
Vagrant on the host machine may not have permission to read the file.

我使用的是bento/ubuntu-16.04盒子。

我尝试寻找一种方法来更改配置命令的权限,但我只找到了更改 config.vm.share_folder 命令的所有者的方法。

你知道答案吗?

nginx ubuntu-16.04 vagrantfile
2个回答
22
投票

如错误消息所示以及来自文档

文件配置程序以 SSH 或 PowerShell 用户身份上传文件。这很重要,因为这些用户通常自己没有提升的权限。如果您想将文件上传到需要提升权限的位置,我们建议将它们上传到临时位置,然后使用 shell 配置程序将它们移动到位。

因此,

vagrant
用户(如果未修改)用于 scp 文件,但您无法使用它访问
/etc/

要使其正常工作,您需要将其上传到临时位置,然后使用 shell 配置程序将其移动到目标目录:

config.vm.provision "file", 
  source: "./bolt.local.conf", 
  destination: "/tmp/bolt.local.conf"

config.vm.provision "shell",
  inline: "mv /tmp/bolt.local.conf /etc/nginx/conf.d/bolt.local.conf"

此功能之所以有效,是因为

privileged
选项在 shell 配置程序上默认为 true。但是有两个配置程序只是为了复制配置文件有点复杂,对吗?

如果该文件已经在您的共享文件夹中,您可以使用 shell 配置程序将其复制到 nginx 目录中,这样您最终会得到如下所示的结果:

# This is the default and serve just as a reminder
config.vm.synced_folder ".", "/vagrant"
config.vm.provision "shell",
  inline: "cp /vagrant/bolt.local.conf /etc/nginx/conf.d/bolt.local.conf"

0
投票

首先复制

vagrant
用户有权访问的文件,例如
/home/vagrant

然后将其移动到您想要的位置。

config.vm.provision "file", source: "./sources.list", destination: "./sources.list"
config.vm.provision "shell", inline: "mv ./sources.list /etc/apt/sources.list"

效果很好,因为

file provisioners
使用普通用户,但
shell provisioners
使用 root 用户来完成工作。

© www.soinside.com 2019 - 2024. All rights reserved.