Docker卷和Apache权限

5
我正在使用Docker来作为PHP运行大型网站。问题在于,当我将主机卷链接到容器时,会出现权限错误。我知道可以运行chmod -R 777 /var/www,但这不是有点危险吗?
我的Dockerfile:
FROM php:7.0.3-apache 
RUN docker-php-ext-install mysqli
RUN a2enmod rewrite
RUN a2enmod headers
RUN docker-php-ext-install pdo_mysql
RUN apt-get update -y && apt-get install -y sendmail libpng-dev

RUN apt-get update && \
    apt-get install -y \
        zlib1g-dev 

RUN apt-get update && apt-get install -y \
        libfreetype6-dev \
        libjpeg62-turbo-dev \
        libpng-dev \
    && docker-php-ext-install -j$(nproc) iconv \
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
    && docker-php-ext-install -j$(nproc) gd

RUN docker-php-ext-install mbstring

RUN docker-php-ext-install zip

RUN docker-php-ext-install gd

我的Docker-Compose.yml

version: "2"
services:
    www:
        build: .
        ports: 
            - "80:80"
        volumes:
            - ./test.com:/var/www/
        links:
            - db
        networks:
            - default
    db:
        image: mysql:5.7
        ports: 
            - "3306:3306"
        environment:
            MYSQL_DATABASE: test
            MYSQL_USER: test
            MYSQL_PASSWORD: test
            MYSQL_ROOT_PASSWORD: test
        volumes:
            - ./mysql:/var/lib/mysql
        networks:
            - default

有没有什么办法可以处理主机卷权限?
3个回答

1

我花了一些时间寻找这种情况的最佳解决方案。 我发现最清晰的方法是在主机机器上将权限设置为用户33。

我尝试过的选项:

  1. 在Docker composer文件中定义不同的用户ID:可能多次起作用,但是当Apache尝试使用内部文件(例如ssh密钥)时可能会导致错误。

  2. 将本地UID作为环境变量传递并添加www-data到相同的组/ID:您必须在构建过程中执行此操作作为Docker文件指令的一部分,因此当您创建具有来自主机机器的权限的图像时,它还会创建另一个可疑的场景。

我发现的最简洁的方法是将权限授予用户33的本地文件。请注意,您不必创建该用户。

setfacl -R -m u:33:rwx /path/to/your/files


0

绝对不建议使用chmod777,正如您已经怀疑的那样。您需要使用以下命令将文件夹和文件的所有权更改为apache组:chown -R <current_user>:www-data /test.com并将权限更改为755

希望这可以帮助您。


0

您可以设置Docker容器的用户UID与主机用户的UID相同。这应该会有所帮助。


你能给个例子吗?我的主机用户名是docker。我需要将用户docker添加到容器中并赋予文件夹权限吗? - user257980
1
你可以通过命令 id -uid -g 获取PUID和GUID。而且你可以通过Dockerfile在容器内创建用户,就像这样:ARG PUID=1000 ARG PGID=1001 RUN groupadd -g $PGID customgrpoup && useradd -u $PUID -g customgrpoup -m customuser现在,你应该使用新的customuser在容器内启动服务。此外,你还可以通过docker-compose文件将PUID和GUID作为环境变量传递。如果这样做,主机用户和Docker用户在文件系统中将是相同的。 - mr MaxSimka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接