Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
写入共享卷docker_Docker - Fatal编程技术网

写入共享卷docker

写入共享卷docker,docker,Docker,我有一个带有php应用程序的docker 例如,我有一个共享卷 /home/me/dev/site <=> /var/www/site 它起作用了 但是,如果我的服务器试图创建一个名为www-data的文件,由于权限问题,该文件无法工作 有没有办法让我的共享卷访问www-data 我正在使用Docker中的boot2docker(绑定装载)卷,Docker将维护在上设置的权限 Docker主机本身。您可以使用此设置对这些对象的权限 在容器中使用文件和目录之前 一些背景 Linux中

我有一个带有php应用程序的docker

例如,我有一个共享卷

/home/me/dev/site <=> /var/www/site
它起作用了

但是,如果我的服务器试图创建一个名为
www-data
的文件,由于权限问题,该文件无法工作

有没有办法让我的共享卷访问
www-data

我正在使用Docker中的boot2docker(绑定装载)卷,Docker将维护在上设置的权限 Docker主机本身。您可以使用此设置对这些对象的权限 在容器中使用文件和目录之前

一些背景

Linux中的权限基于用户和组ID(
'uid'
/
'gid'
)。即使 虽然您将用户名和组名视为所有者,但这些名称实际上并不是所有者 重要的是,在Linux中,它们只是为了让您更容易看到文件的所有者(它们是从
/etc/passwd
文件中查找的)

您可以在文件上设置任何
uid
/
gid
;设置这些权限时,用户不必存在。比如,

touch foobar&sudo chown 1234:5678 foobar&ls-la foobar
#UID和GID设置为1234/5678,即使没有这样的用户
-rw-rw-r--11245678 0 Mar 25 19:14 foobar
检查权限(容器内部和外部) 如上所述,Docker在使用时维护主机的所有权 一本书。此示例显示卷中的权限和所有权是 容器内外相同

#(首先创建一个虚拟站点)
mkdir-p卷示例/站点和cd卷示例
echo“hello world”>site/index.html
#Docker主机上的权限;
ls-n站点
#总数4
#-rw-rw-r--1 1002 1002 38 Mar 25 19:15 index.html
#以及nginx容器内的权限,将其用作卷;
sudo docker run--rm-v$(pwd)/site:/var/www nginx ls-n/var/www
#总数4
#-rw-rw-r--1 1002 1002 38 Mar 25 19:15 index.html
设置权限 如前所述,用户不必存在就可以使用它们,因此即使 Docker主机上没有
www-data
用户,我们仍然可以设置正确的 权限,如果我们知道容器中该用户的“uid”和“gid”

让我们看看容器中www数据用户的uid和gid是什么

sudo docker run--rm nginx id www数据
#uid=33(www数据)gid=33(www数据)groups=33(www数据)
在更改权限之前,首先检查状态。这次我们 以用户身份运行nginx容器
www-data

sudo docker运行\
--rm\
--卷$(pwd)/站点:/var/www\
--用户www-data nginx-touch/var/www/can-i-write.txt
#触摸:无法触摸“/var/www/can-i-write.txt”:权限被拒绝
接下来,设置本地目录的权限,看看我们是否能够写入

sudo chown-R 33:33站点
sudo docker跑步\
--rm\
--卷$(pwd)/站点:/var/www\
--用户www-data nginx-touch/var/www/can-i-write.txt

成功

将以下行添加到dockerfile并重建图像

RUN usermod -u 1000 www-data
RUN usermod -G staff www-data

该用户是否需要对卷的写入权限,或者是否需要能够执行docker(作为管理卷的包装器)?用户需要在卷中创建文件,不仅仅是从卷中执行文件,而且创建和执行是通过shell进行的,还是您必须使用
docker exec
命令来执行?不,这是一个网站,它可以在我加载页面时创建文件。例如,您写入的文件夹的当前权限(即用户和组)是什么?如果是root用户,您可能需要
chown
将其发送给普通用户,或者创建一个用户组,该用户组可以同时包含普通/root用户和www用户,并将该用户组指定为文件夹的所有者谢谢,你救了我一天,它在linux上运行良好。但它在Osx和docker机器上不起作用。有什么建议吗?这是一个很好的解释,谢谢。但是,如果我们想在主机和容器中使用不同的UID/GID呢?例如,
33
可能是容器中的合法用户,但也可能是主机上的“坏人”。另外,我希望所有文件都属于主机上我的用户帐户,而不是某个神秘的用户
33
。如果容器的uid与主机中现有用户的uid冲突怎么办?你最终会让他们访问它。此外,您正在主机系统中设置一些仅对容器有意义的悬空UID。出于这些原因,我认为最好采用另一种方法:将容器的uid设置为与主机的uid匹配,或使用linux上的“docker”组>我认为最好采用另一种方法:将容器的uid设置为与主机的uid匹配,或使用“docker”组linux上的
docker
组不应使用,因为它提供对docker套接字的访问(API访问)。匹配容器以作为当前用户运行;这里描述的场景对于开发环境最为有用(在容器外部处理文件,但允许容器访问),但是,使容器使用不同于其设计运行的方式将使您的开发环境与生产环境更为不同(您不应在生产中使用绑定装载),这可能会引起其他的头痛。太好了!这就是我一直在寻找的。此命令的文档。基本上,www数据的用户id更改为1000,并添加到员工组中。为什么是1000或1000名员工?运行
docker exec-it CONTAINER\u NAME\u或\u ID bash
一次运行
ls-la/var/www
您将看到示例
drwxr-xr-x 1000 staff 238 Aug 20:14 html
这对我的Ubuntu桌面很有用,因为我的uid是1000。如果你不是第一个用户帐户(默认值为1000),你需要用你的uid替换1000。太棒了!!
RUN usermod -u 1000 www-data
RUN usermod -G staff www-data