Docker部署Apache/Nginx在Windows正常,Linux Mint下报403权限错误求助
问题:Linux Mint下Docker部署Apache/Nginx出现403权限错误
在Windows 11上通过Docker部署Laravel环境一切正常,但在Linux Mint系统部署时,Apache和Nginx均出现403错误,尝试重装组件、设置权限、检查端口等操作均未解决。
错误信息
[core:crit] [pid 18] (13)Permission denied: [client 172.18.0.1:48670] AH00529: /var/www/html/.htaccess pcfg_openfile: unable to check htaccess file, ensure it is readable and that '/var/www/html/' is executable
相关配置文件
Dockerfile
FROM php:7.4.1-apache USER root WORKDIR /var/www/html RUN apt update && apt install -y \ libpng-dev \ zlib1g-dev \ libxml2-dev \ libzip-dev \ libonig-dev \ zip \ curl \ unzip \ && docker-php-ext-configure gd \ && docker-php-ext-install -j$(nproc) gd \ && docker-php-ext-install pdo_mysql \ && docker-php-ext-install mysqli \ && docker-php-ext-install zip \ && docker-php-source delete COPY apache/vhost.conf /etc/apache2/sites-available/000-default.conf RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer RUN chown -R www-data:www-data /var/www/html && a2enmod rewrite
docker-compose.yml
version: '3' services: app: build: context: . dockerfile: Dockerfile image: laravel container_name: app restart: unless-stopped tty: true ports: - "80:80" volumes: - ./:/var/www/html networks: - laranet mysql: image: mysql container_name: db restart: unless-stopped tty: true ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: root volumes: - mysqldata:/var/lib/mysql networks: - laranet networks: laranet: driver: bridge volumes: mysqldata: driver: local
vhost.conf
<VirtualHost *:80> DocumentRoot /var/www/html/public <Directory "/var/www/html"> AllowOverride all Require all granted </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined
解决方案
1. 修复宿主机目录权限
Linux Mint文件系统权限校验严格,宿主机挂载目录需确保容器内www-data用户(UID通常为33)可访问:
# 给当前目录及子目录设置可执行权限(允许Apache遍历目录) chmod -R 755 ./ # 将目录所属组改为www-data对应的GID(33) chown -R :33 ./
2. 优化Dockerfile权限配置
在Dockerfile的chown命令后添加目录权限强制设置,避免挂载后权限丢失:
RUN chown -R www-data:www-data /var/www/html && a2enmod rewrite # 新增:确保目录有可执行权限 RUN chmod -R 755 /var/www/html
3. 关闭SELinux限制(若启用)
SELinux可能阻止容器访问宿主机文件,临时关闭执行:
sudo setenforce 0
如需永久关闭,编辑/etc/selinux/config,将SELINUX=enforcing改为SELINUX=disabled后重启系统。
4. 匹配容器与宿主机用户UID/GID
在docker-compose.yml的app服务中添加用户配置,让容器进程使用宿主机当前用户的UID/GID:
services: app: # ...其他配置 user: "${UID:-33}:${GID:-33}"
然后在宿主机创建.env文件:
echo "UID=$(id -u)" >> .env echo "GID=$(id -g)" >> .env
内容的提问来源于stack exchange,提问作者DM Souza
相关产品推荐
相关产品推荐

