来自php的Docker容器:5.6-apache作为root

时间:2016-05-08 12:28:00

标签: apache docker

这与Docker php:5.6-Apache Development Environment missing permissions on volume mount

有关

我已尝试了几乎所有内容以使www-data可以读取已装入的卷,我当前的解决方案是尝试通过脚本将应用程序所需的文件夹移动到/var并提供适当的权限由www-data写成,但这很难维持。

认为这是一个开发环境,我不介意成为安全漏洞,因此我希望apache作为root运行

  

错误:Apache没有设计为在运行时提供页面   根。已知的竞争条件将允许任何本地用户   读取系统上的任何文件。如果您仍然希望将页面作为   root然后将-DBIG_SECURITY_HOLE添加到您的CFLAGS行   src /配置文件并重建服务器。这是强烈的   建议你修改你的用户指令   httpd.conf文件列出非root用户。

使用docker image php:5.6-apache

有什么简单的方法可以解决这个问题

这是我的docker-compose.yml

version: '2'
services:

    api:
        container_name: api
        privileged: true
        build:
            context: .
            dockerfile: apigility/Dockerfile
        ports:
            - "2020:80"
        volumes:
            - /ft/code/api:/var/www:rw

这是我的Dockerfile

FROM php:5.6-apache

USER root
RUN apt-get update \
    && apt-get install -y sudo openjdk-7-jdk \
    && echo "www-data ALL=NOPASSWD: ALL" >> /etc/sudoers

RUN apt-get install -y git zlib1g-dev libmcrypt-dev nano vim --no-install-recommends \
    && apt-get clean \
    && rm -r /var/lib/apt/lists/* \
    && docker-php-ext-install mcrypt zip \
    && curl -sS https://getcomposer.org/installer \
    | php -- --install-dir=/usr/local/bin --filename=composer \
    && a2enmod rewrite \
    && sed -i 's!/var/www/html!/var/www/public!g' /etc/apache2/apache2.conf \
    && echo "AllowEncodedSlashes On" >> /etc/apache2/apache2.conf \
    && cp /usr/src/php/php.ini-production /usr/local/etc/php/php.ini \
    && printf '[Date]\ndate.timezone=UTC' > /usr/local/etc/php/conf.d/timezone.ini

WORKDIR /var/www

3 个答案:

答案 0 :(得分:2)

为什么不完全按照你提到的问题所说的那样做呢?

RUN usermod -u 1000 www-data
RUN groupmod -g 1000 www-data

这不是黑客攻击。它是解决您在开发环境中遇到的问题的正确方法。

答案 1 :(得分:0)

因此,我设法通过使用相关帖子中的答案部分为www-data提供已安装的数据,但是需要另外一步才能使用。

运行docker-machine start default后,您需要ssh到它并运行以下内容:

sudo mkdir --parents /code [其中/code是virtualbox中的共享文件夹]

sudo mount -t vboxsf -o uid=999,gid=999 code /code [这是为了确保uidgid为999,以便下一部分工作]

然后在Dockerfile添加

RUN usermod -u 999 www-data \
    && groupmod -g 999 www-data

安装好后,/code将拥有所有者www-data,问题就解决了!

答案 2 :(得分:0)

另一个更好的解决方案。

在dockerfile中添加

RUN cd ~ \
    && apt-get -y install dpkg-dev debhelper libaprutil1-dev libapr1-dev libpcre3-dev liblua5.1-0-dev autotools-dev \
    && apt-get source apache2.2-common \
    && cd apache2-2.4.10 \
    && export DEB_CFLAGS_SET="-g -O2 -fstack-protector-strong -Wformat -Werror=format-security -DBIG_SECURITY_HOLE" \
    && dpkg-buildpackage -b \
    && cd .. \
    && dpkg -i apache2-bin_2.4.10-10+deb8u7_amd64.deb \
    && dpkg -i apache2.2-common_2.4.10-10+deb8u7_amd64.deb

之后,您可以以root身份运行apache。

PS:apache2-2.4.10,apache2-bin_2.4.10-10 + deb8u7_amd64.deb和apache2.2-common_2.4.10-10 + deb8u7_amd64.deb可能会根据您的来源发生变化