写共享卷泊坞窗

我有一个PHP应用程序的docker

例如,我有一个分享量

/home/me/dev/site <=> /var/www/site 

我可以在我的主机上写东西,它会与容器同步

如果我启动

 sudo docker exec test touch /var/www/site/test.txt 

有用

但是,如果我的服务器试图创build一个文件作为www-data这是不工作的,因为权利。

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

我正在使用boot2docker

(绑定装入)在Docker中的卷将维护在Docker主机本身上设置的权限。 在容器中使用它们之前,可以使用它来设置这些文件和目录的权限。

一些背景 ;

Linux中的权限基于用户和组ID'uid' / 'gid' )。 即使你看到一个用户和组是所有者,这些名字在Linux中并不重要,它们只是让你更容易地看到谁是文件的所有者(他们是从/etc/passwd文件)。

你可以设置一个文件的任何 uid / gid ; 用户在设置这些权限时不必存在 。 例如;

 touch foobar && sudo chown 1234:5678 foobar && ls -la foobar # UID and GID are set to 1234 / 5678, even though there's no such user -rw-rw-r-- 1 1234 5678 0 Mar 25 19:14 foobar 

检查权限(在容器内部和外部)

如上所述,在使用卷时,Docker将维护主机的所有权。 此示例显示卷中的权限和所有权在容器外部内部是相同的;

 # (First create a dummy site) mkdir -p volume-example/site && cd volume-example echo "<html><body>hello world</body></html>" > site/index.html # Permissions on the Docker host; ls -n site # total 4 # -rw-rw-r-- 1 1002 1002 38 Mar 25 19:15 index.html # And, permissions inside a nginx container, using it as volume; sudo docker run --rm -v $(pwd)/site:/var/www nginx ls -n /var/www # total 4 # -rw-rw-r-- 1 1002 1002 38 Mar 25 19:15 index.html 

设置权限

正如所解释的,用户不必为了使用而存在,所以即使我们在Docker主机上没有www-data用户,如果我们知道“uid”,我们仍然可以设置正确的权限。该用户在容器内的“gid”

让我们看看www-data用户的uid和gid是容器里面的。

 sudo docker run --rm nginx id www-data # uid=33(www-data) gid=33(www-data) groups=33(www-data) 

首先检查更改权限之前的状态。 这次我们以用户www-data运行nginx容器;

 sudo docker run \ --rm \ --volume $(pwd)/site:/var/www \ --user www-data nginx touch /var/www/can-i-write.txt # touch: cannot touch `/var/www/can-i-write.txt': Permission denied 

接下来,在本地目录设置权限,看看我们是否可以写;

 sudo chown -R 33:33 site sudo docker run \ --rm \ --volume $(pwd)/site:/var/www \ --user www-data nginx touch /var/www/can-i-write.txt 

成功!

将以下行添加到您的dockerfile并重build您的图像

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