Вопросы разрешения с apache внутри докера

Я использую docker для запуска экземпляра apache. Мой файл докеров выглядит примерно так:

FROM ubuntu

MAINTAINER [email protected]

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

ИЗМЕНИТЬ

вывод ls -laR /var/www в конце файла Docker:

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

вывод namei -m /var/www/index.php в конце файла Docker:

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, чтобы увидеть, могу ли я заставить что-нибудь работать, я попытался добавить исходные файлы из файла Docker в /var/www/html, расположение по умолчанию для файлов Apache, которые будут обслуживаться.

Я точно соответствовал разрешениям файлов по умолчанию (я думаю), и он все еще не работает. По умолчанию index.html, который поставляется с загрузкой apache, просто прекрасен, но в добавленной папке src по-прежнему есть ошибка, запрещенная к доступу 403.

Я изменил файл Docker на 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

Возможно, chmod работает не так, как я думал, что он делает?

EDIT3

Последний бит информации. Контейнер Docker строится buildbot, который я принимаю как root. Я не смог воспроизвести этот сценарий, не используя buildbot для создания здания.

Построение всех с помощью команд sudo docker build -t apache . на моем ноутбуке отлично работает, но проблемы возникают, когда buildbot делает это. Не знаю, почему: ^/

Ответ 1

Я просто столкнулся с этим после публикации аналогичного вопроса в Запуск приложения внутри Docker как пользователя без полномочий root.

Думаю, вы не можете chmod/chown файлы, которые были добавлены с помощью команды ADD. - thom_nic 19 июн в 14:14

Собственно, вы можете. Вам просто нужно выпустить команду RUN после ADD для местоположения файла, который будет ВСТАВЛЕНО в вашем контейнере. Например

ADD extras/dockerstart.sh /usr/local/servicemix/bin/
RUN chmod 755 /usr/local/bin/dockerstart.sh

Надеюсь, что это поможет. Это сработало для меня.

Ответ 2

Я столкнулся с подобной проблемой; однако мой контейнер использовал VOLUME для сопоставления каталогов в контейнере.

Изменение разрешений в каталоге, который сопоставляется с /var/www/html самостоятельно, устраняет 403 Запрещенные ошибки.

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 должен применяться на хосте 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 .