如何仅使用Dockerfile部署单容器Yii1应用解决访问空目录问题
问题根因
此前docker-compose运行正常的核心是通过volumes挂载本地项目源码、Apache自定义配置到容器内,镜像本身不包含业务代码与定制配置。单独通过Dockerfile构建镜像时,未将上述资源打包进镜像层,容器启动后/var/www/html为php:7.3-apache镜像默认的空目录,因此访问时仅显示空目录索引。
Dockerfile调整项
- 复制项目源码到容器web根目录
若Dockerfile放在Yii1项目根目录,通过COPY指令将源码打入镜像,注意匹配Yii1的目录结构:如果项目入口文件index.php直接在项目根目录,直接复制全量代码即可;如果入口在web/子目录,需要同步调整Apache站点根目录配置。
示例指令:# 先复制composer配置文件安装依赖,利用构建缓存减少重复构建耗时 COPY composer.json composer.lock /var/www/html/ RUN composer install --no-dev --optimize-autoloader --no-interaction # 复制剩余项目源码 COPY . /var/www/html/ - 替换Apache默认站点配置
将之前docker-compose中挂载的自定义Apache vhost配置,通过COPY指令打入镜像覆盖默认配置,确保配置中DocumentRoot指向Yii应用入口目录、AllowOverride All已开启(支持.htaccess重写规则)、Directory索引配置正确。
示例指令:# 假设你的自定义vhost文件存放在Dockerfile同级的apache目录下 COPY ./apache/000-default.conf /etc/apache2/sites-available/000-default.conf - 配置正确的文件权限
Yii1运行需要对runtime(缓存、日志目录)、assets(静态资源发布目录)有写入权限,复制完源码后需修正目录属主与权限:RUN chown -R www-data:www-data /var/www/html \ && chmod -R 755 /var/www/html \ && chmod -R 777 /var/www/html/runtime /var/www/html/assets - 新增.dockerignore文件过滤无效文件
在Dockerfile同级目录创建.dockerignore,避免将本地无关文件打入镜像增大体积,示例配置:.git .env runtime/* assets/* docker-compose.yml Dockerfile .dockerignore README.md
部署验证
- 重新构建镜像:
docker build -t docker_webcrawler . - 启动容器,若使用远程数据库可通过环境变量传入配置:
docker run -d -p 80:80 \ -e DB_HOST=你的远程数据库地址 \ -e DB_NAME=数据库名 \ -e DB_USER=数据库用户名 \ -e DB_PASS=数据库密码 \ --name cntr-apache docker_webcrawler - 若访问异常,可进入容器排查:
docker exec -it cntr-apache /bin/bash,优先检查/var/www/html下是否存在项目源码、Apache站点配置是否与此前compose使用的配置一致、/var/log/apache2/error.log中的错误信息定位问题。
内容的提问来源于stack exchange,提问作者mightycode Newton
相关产品推荐
相关产品推荐

