如何将Yii2迁移文件导入Docker容器并执行
Yii2 Docker容器环境执行数据库迁移方案
完全可以实现,不需要额外导入迁移文件——你当前的docker-compose配置已经把本地项目根目录挂载到php容器的/app路径,本地migrations目录下的所有迁移文件会实时同步到容器内,直接执行迁移命令即可读取。以下是两种常用实现方式:
方式一:容器运行时手动执行迁移
适合开发调试场景,不需要修改现有配置,操作步骤:
- 启动全部容器:
docker-compose up -d - 等待数据库容器启动完成后,执行命令进入php服务容器:
docker-compose exec php bash - 在容器内执行非交互模式迁移命令:
php yii migrate --interactive=0
加
--interactive=0参数是跳过命令行的yes/no确认环节,避免非交互环境下命令卡住。
如果需要执行增量迁移、回滚等操作,直接替换对应yii命令即可:
- 执行单个最新迁移:
php yii migrate/up 1 - 回滚上一步迁移:
php yii migrate/down 1 - 查看迁移状态:
php yii migrate/history
方式二:容器启动时自动执行迁移
适合测试、生产部署场景,避免人工漏执行迁移。只需修改docker-compose.yml中php服务的配置,增加数据库等待、自动迁移逻辑,再启动apache服务即可,修改后的php服务配置参考:
php: image: yiisoftware/yii2-php:7.1-apache volumes: - ~/.composer-docker/cache:/root/.composer/cache:delegated - ./:/app:delegated ports: - '8000:80' networks: - my-network depends_on: - db command: > bash -c " # 等待MySQL服务完全就绪,避免迁移报连接错误 while ! nc -z db 3306; do sleep 1; done # 执行全部迁移 php yii migrate --interactive=0 # 启动原有apache服务 apache2-foreground "
yiisoftware/yii2-php:7.1-apache镜像默认预装了netcat工具,可直接使用
nc命令做端口连通性检测,不需要额外安装。
配置修正提示
你当前的配置存在三处容易出问题的点,建议提前调整:
- 卷名不一致:你在顶层volumes定义的卷名为
restatdb,但db服务挂载的卷名写的是mydb,启动时会自动创建新的匿名卷,可能导致数据库数据丢失,建议把db服务的volumes配置改为- restatdb:/var/lib/mysql保持命名统一。 - 数据库连接配置:确认项目内
config/db.php的数据库连接地址为docker-compose内的db服务名db,账号、密码、库名和db服务的环境变量配置一致,参考配置:return [ 'class' => 'yii\db\Connection', 'dsn' => 'mysql:host=db;dbname=my-db', 'username' => 'root', 'password' => 'password', 'charset' => 'utf8mb4', ]; - 你提供的Dockerfile目前没有被docker-compose引用(php服务直接使用了官方公共镜像,没有配置build参数),且该Dockerfile基于alpine:3.4构建,和你实际运行的php环境不匹配,如果需要自定义镜像,建议统一使用yiisoftware/yii2-php:7.1-apache作为基础镜像修改,避免环境差异导致功能异常。
内容的提问来源于stack exchange,提问作者Paul Stokvinsky
相关产品推荐
相关产品推荐

