You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅使用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
    
部署验证
  1. 重新构建镜像:docker build -t docker_webcrawler .
  2. 启动容器,若使用远程数据库可通过环境变量传入配置:
    docker run -d -p 80:80 \
      -e DB_HOST=你的远程数据库地址 \
      -e DB_NAME=数据库名 \
      -e DB_USER=数据库用户名 \
      -e DB_PASS=数据库密码 \
      --name cntr-apache docker_webcrawler
    
  3. 若访问异常,可进入容器排查:docker exec -it cntr-apache /bin/bash,优先检查/var/www/html下是否存在项目源码、Apache站点配置是否与此前compose使用的配置一致、/var/log/apache2/error.log中的错误信息定位问题。

内容的提问来源于stack exchange,提问作者mightycode Newton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 00:39:36