Apache内部的Docker权限问题

时间:2014-05-23 18:45:29

标签: 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"]

但是,当我构建容器并运行它时,我只会遇到403错误。

请注意,我已指定Apache应在www-data组中以www-data运行,并且/ var / www已递归chown d属于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

修改

Dockerfile末尾的ls -laR /var/www输出:

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

Dockerfile末尾的namei -m /var/www/index.php输出:

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

EDIT2

在尝试了很多事情之后,包括chmod -R 777只是为了看看我是否能够任何工作,我尝试将从Dockerfile添加的源文件放入{{1} },要提供的Apache文件的默认位置。

我完全匹配了默认文件权限(我认为),但仍然无效。 Apache附带的默认index.html加载得很好,但添加的/var/www/html文件夹仍然有src访问被拒绝错误。

我将Dockerfile更改为403,并使用以下命令设置权限:

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 {} + 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 不能像我想象的那样工作?

EDIT3

最后一点信息。 Docker容器是由buildbot构建的,我一直假设以root身份运行。如果不使用buildbot进行构建,我无法重现这种情况。

在我的笔记本电脑上通过chmod类型命令构建所有内容工作正常,但是当buildbot执行此操作时会出现问题。不明白为什么:^ /

2 个答案:

答案 0 :(得分:9)

我在Running app inside Docker as non-root user发布类似问题后遇到了这个问题。

  

我的猜测是你可以通过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

希望有所帮助。它对我有用。

答案 1 :(得分:4)

我遇到了类似的问题;但是我的容器使用AllowOverride All来映射容器中的目录。

更改映射到VOLUME的目录的权限本身可以解决403 Forbidden错误。

/var/www/html

请注意,必须在Docker主机上应用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 . ,而不是在容器内。在容器中执行它不会影响目录。

chmod