docker卷和apache权限



我使用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

你知道如何处理主机卷权限吗?

我花了一些时间为这个案例寻找最佳解决方案。我发现最干净的方法是在主机上为用户33设置权限。

我尝试过的选项:

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

  2. 将本地UID作为env变量传递,并将www数据添加到同一组/id:作为Docker文件指令的一部分,您必须在构建过程中这样做,因此当您从主机创建具有权限的映像时,它也会创建另一个粗略的场景。

我发现的不那么混乱的方法是将本地文件的权限授予用户33。请注意,您不必创建用户。

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

正如您已经怀疑的那样,用777代替chmod绝对不是一个好主意。您需要使用:chown -R <current_user>:www-data /test.com将文件夹和文件切换到apache组,并将权限更改为755

我希望这能帮助你

您可以设置docker容器的用户的uid等于主机用户的uid。这应该会有所帮助。

最新更新