d0c*_*age 13 apache file-permissions docker
我正在使用Docker来运行Apache实例.我的docker文件是这样的:
FROM ubuntu
MAINTAINER your.face@gmail.com
RUN cat /etc/passwd
RUN cat /etc/group
RUN apt-get update && apt-get install -yq apache2 php5 libapache2-mod-php5 php5-mysql
RUN apt-get install -yq openssh-server
RUN mkdir /var/run/sshd
ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2
EXPOSE 80
ADD config/apache2/000-default.conf /etc/apache2/sites-available/000-default.conf
ADD config/php5/php.ini /etc/php5/apache2/php.ini
ADD config/start.sh /tmp/start.sh
ADD src /var/www
RUN chown -R root:www-data /var/www
RUN chmod u+rwx,g+rx,o+rx /var/www
RUN find /var/www -type d -exec chmod u+rwx,g+rx,o+rx {} +
RUN find /var/www -type f -exec chmod u+rw,g+rw,o+r {} +
#essentially: CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]
CMD ["/tmp/start.sh"]
Run Code Online (Sandbox Code Playgroud)
但是,当我构建容器并运行它时,我只会遇到403错误.
请注意,我已经指定Apache应该www-data在www-data组中运行,并且/ var/www已经递归chown地属于root:www-data.
此外,所有目录都是可搜索和可读的,并且所有文件都可由www-data组读取和写入(嗯,根据ls -la和namei -m它们无论如何都是如此).
如何修复这些权限问题?我弄清楚了.
来自Apache error.log的实际错误:
[Fri May 23 18:33:27.663087 2014] [core:error] [pid 14] (13)Permission denied: [client 11.11.11.11:61689] AH00035: access to /index.php denied (filesystem path '/var/www/index.php') because search permissions are missing on a component of the path
Run Code Online (Sandbox Code Playgroud)
编辑:
的输出ls -laR /var/www在Dockerfile的末尾:
Step 21 : RUN ls -laR /var/www
---> Running in 74fd3609dfc8
/var/www:
total 1036
drwxr-xr-x 67 root www-data 4096 May 23 18:38 .
drwxr-xr-x 26 root root 4096 May 23 18:38 ..
-rw-rw-r-- 1 root www-data 28 May 23 12:22 .gitignore
-rw-rw-r-- 1 root www-data 501 May 23 12:22 .htaccess
-rw-rw-r-- 1 root www-data 7566 May 23 12:22 index.php
Run Code Online (Sandbox Code Playgroud)
的输出namei -m /var/www/index.php在Dockerfile的末尾:
Step 22 : RUN namei -m /var/www/index.php
---> Running in 1203f0353090
f: /var/www/index.php
drwxr-xr-x /
drwxr-xr-x var
drwxr-xr-x www
-rw-rw-r-- index.php
Run Code Online (Sandbox Code Playgroud)
EDIT2
在尝试了很多东西之后,包括chmod -R 777只是为了看看我是否可以使用任何东西,我尝试将从Dockerfile添加的源文件放入/var/www/htmlApache服务器的默认位置.
我完全匹配了默认文件权限(我认为),它仍然无法正常工作.Apache附带的默认index.html加载得很好,但添加的src文件夹仍然存在403拒绝访问错误.
我将Dockerfile更改为,ADD src /var/www/html/src并使用以下命令设置权限:
RUN find /var/www/html -type d -exec chmod u+rwx,g+rx,o+rx {} +
RUN find /var/www/html -type f -exec chmod u+rw,g+r,o+r {} +
Run Code Online (Sandbox Code Playgroud)
没运气.下面是一些输出ls -laR上/var/www.请注意,html文件夹和安装index.html附带的权限与apache2添加的src文件夹的权限相匹配:
Step 19 : RUN ls -laR /var/www/
---> Running in 0520950d0426
/var/www/:
total 12
drwxr-xr-x 6 root root 4096 May 23 19:23 .
drwxr-xr-x 24 root root 4096 May 23 19:23 ..
drwxr-xr-x 5 root root 4096 May 23 19:23 html
/var/www/html:
total 24
drwxr-xr-x 5 root root 4096 May 23 19:23 .
drwxr-xr-x 6 root root 4096 May 23 19:23 ..
-rw-r--r-- 1 root root 11510 May 23 18:28 index.html
drwxr-xr-x 47 root root 4096 May 23 19:23 src
/var/www/html/src:
total 1032
drwxr-xr-x 47 root root 4096 May 23 19:23 .
drwxr-xr-x 5 root root 4096 May 23 19:23 ..
-rw-r--r-- 1 root root 28 May 23 12:22 .gitignore
-rw-r--r-- 1 root root 501 May 23 12:22 .htaccess
-rw-r--r-- 1 root root 7566 May 23 12:22 index.php
Run Code Online (Sandbox Code Playgroud)
也许chmod不像我想的那样工作?
EDIT3
最后一点信息.Docker容器是由buildbot构建的,我一直假设以root身份运行.如果不使用buildbot进行构建,我无法重现这种情况.
通过sudo docker build -t apache .我的笔记本电脑上的类型命令构建一切工作正常,但是当buildbot这样做时会出现问题.不明白为什么:^ /
小智 9
我刚刚在Docker中运行应用程序作为非root用户发布类似问题后遇到了这个问题.
我的猜测是你不能通过ADD命令添加chmod/chown文件. - thom_nic 6月19日14:14
其实你可以.您只需要在ADD之后为将要容纳在容器中的文件位置发出一个RUN命令.例如
ADD extras/dockerstart.sh /usr/local/servicemix/bin/
RUN chmod 755 /usr/local/bin/dockerstart.sh
Run Code Online (Sandbox Code Playgroud)
希望有所帮助.它对我有用.
我遇到了类似的问题;但是我的容器VOLUME用于在整个容器中映射目录。
更改映射到/var/www/html自身的目录的权限修复了 403 Forbidden 错误。
docker-host$ ls -ld /var/www/html
drwxr--r-- 53 me staff 1802 Mar 8 22:33 .
docker-host$ chmod a+x /var/www/html
docker-host$ ls -ld /var/www/html
drwxr-xr-x 53 me staff 1802 Mar 8 22:33 .
Run Code Online (Sandbox Code Playgroud)
注意chmod必须应用在Docker主机上,而不是容器内。在容器内执行它不会影响目录。
docker-container$ chmod a+x /var/www/html
docker-container$ ls -ld /var/www/html
drwxr--r-- 53 me staff 1802 Mar 8 22:33 .
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
26443 次 |
| 最近记录: |