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

在Docker Compose中执行php artisan migrate时遇php命令未找到错误

解决Docker Compose中执行php artisan migrate时的"php: command not found"错误

在Docker Compose环境中尝试执行php artisan migrate命令时,mysql容器抛出错误:

sh: php: command not found

问题根源

错误的核心原因是把Laravel迁移命令放到了mysql容器中执行。mysql:latest镜像仅包含数据库服务,没有安装PHP环境,自然无法识别php命令。迁移命令属于Laravel应用操作,必须在包含PHP和项目代码的app容器中执行。

修复步骤

1. 移除mysql容器的错误entrypoint配置

编辑docker-compose.yml,删除mysql服务下的entrypoint行,让mysql容器按默认逻辑启动:

mysql:
    image: mysql:latest
    volumes:
        - dbdata:/var/lib/mysql
    environment:
        MYSQL_DATABASE: ${DB_DATABASE}
        MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
        MYSQL_PASSWORD: ${DB_PASSWORD}
    ports:
        - 3306:3306
# 移除以下错误配置行
# entrypoint: sh -c "sleep 30 && php artisan migrate"

2. 正确执行迁移命令

有两种可靠的执行方式:

方式一:容器启动后手动执行

先启动所有服务:

docker-compose up -d

进入app容器执行迁移:

docker-compose exec app php artisan migrate

方式二:配置app容器自动执行迁移(可选)

如果希望容器启动时自动完成迁移,可修改app服务的启动命令,同时确保mysql服务就绪后再执行迁移:
修改docker-compose.yml的app服务:

app:
    build:
        context: .
    working_dir: /var/www
    volumes:
        - ./:/var/www
    depends_on:
        - "mysql"
    ports:
        - 8001:80
    # 添加自动迁移逻辑,先等待mysql端口可用
    command: sh -c "while ! nc -z mysql 3306; do sleep 1; done && php artisan migrate --force && apache2-foreground"

注意:需要在Dockerfile中安装netcat工具以支持nc命令,在apt-get安装列表中添加netcat-traditional:

RUN apt-get update && apt-get install -y  \
    libfreetype6-dev \
    libjpeg-dev \
    libpng-dev \
    libwebp-dev \
    netcat-traditional \
    --no-install-recommends

3. 验证修复结果

重启容器后,检查迁移状态确认执行成功:

docker-compose exec app php artisan migrate:status

内容的提问来源于stack exchange,提问作者Toma Tomov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 08:07:26