写共享卷泊坞窗
我有一个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