如何阻止docker-compose启动时apache自动创建html目录并自定义为public_html
问题原因
官方php:7.3-apache镜像内置的启动脚本默认会校验/var/www/html目录是否存在,不存在就自动创建,所以你在Dockerfile的RUN阶段执行的删除操作会被容器启动阶段的逻辑覆盖,无法生效。
解决方案
方案一:将Apache默认站点根目录改为public_html(推荐,符合常规Web项目规范)
- 修改Dockerfile内容如下:
FROM php:7.3-apache # 替换Apache默认配置中的站点根目录路径 RUN sed -i 's!/var/www/html!/var/www/public_html!g' /etc/apache2/sites-available/000-default.conf /etc/apache2/apache2.conf # 提前创建public_html目录并配置权限 RUN mkdir -p /var/www/public_html && chown www-data:www-data /var/www/public_html # 可选:启动时自动删除自动生成的html目录 CMD ["sh", "-c", "rm -rf /var/www/html && apache2-foreground"]
- 调整docker-compose.yml的挂载规则(可选)
如果你的代码存放在本地的public_html目录,可直接修改volumes配置,避免挂载整个项目根目录:
volumes: - ./public_html:/var/www/public_html
修改完成后执行docker-compose up --build重建容器启动即可,此时Apache会直接使用public_html作为站点根目录,不会再依赖html目录。
方案二:强制阻止html目录生成(仅适用于确实不需要该目录的场景)
你可以覆盖镜像的默认启动脚本,跳过创建html目录的逻辑:
- 在
./docker/apache/目录下新建entrypoint.sh文件,内容如下:
#!/bin/bash rm -rf /var/www/html exec apache2-foreground
- 本地执行命令给脚本添加执行权限:
chmod +x ./docker/apache/entrypoint.sh - 修改Dockerfile引入自定义启动脚本:
FROM php:7.3-apache RUN rmdir /var/www/html COPY entrypoint.sh /usr/local/bin/ ENTRYPOINT ["entrypoint.sh"]
- 执行
docker-compose up --build重建容器启动即可。
内容的提问来源于stack exchange,提问作者ikenas
相关产品推荐
相关产品推荐

