WSL2中DDEV启动时自动运行Symfony Messenger Worker的问题
解决DDEV中Symfony Messenger Worker容器启动报错问题
问题背景
在WSL2环境中通过DDEV运行Symfony项目,需要实现ddev start时自动启动Messenger Worker。手动启动Worker的命令为:
ddev exec bin/console messenger:consume async_send_data
尝试创建docker-compose-blablabla.yaml添加额外容器,配置如下:
services: dataupdate-worker: container_name: ddev-${DDEV_SITENAME}-dataupdate-worker image: ${DDEV_WEBIMAGE} labels: com.ddev.site-name: ${DDEV_SITENAME} com.ddev.approot: $DDEV_APPROOT command: ["exec", "bin/console", "messenger:consume", "async_send_data", "--limit=0"] depends_on: - redis healthcheck: test: ["CMD-SHELL", "ps aux | grep '[m]essenger:consume' || exit 1"] interval: 10s timeout: 5s retries: 3
启动后报错,日志显示:
"Could not open input file: bin/console"
问题原因
- 未挂载项目代码目录:额外容器没有挂载本地项目代码,导致容器内找不到
bin/console文件 - 命令错误:使用了
exec命令,这是DDEV的外部命令,容器内部无需该指令,直接执行bin/console即可 - 工作目录未指定:容器默认工作目录不是项目根目录,执行
bin/console时路径不正确
解决方案
替换原有docker-compose-blablabla.yaml内容为以下配置:
services: dataupdate-worker: container_name: ddev-${DDEV_SITENAME}-dataupdate-worker image: ${DDEV_WEBIMAGE} labels: com.ddev.site-name: ${DDEV_SITENAME} com.ddev.approot: $DDEV_APPROOT # 挂载本地项目代码到容器默认的项目路径 volumes: - type: bind source: ${DDEV_APPROOT} target: /var/www/html # 指定容器工作目录为项目根目录 working_dir: /var/www/html # 直接执行Symfony console命令,移除不必要的exec command: ["bin/console", "messenger:consume", "async_send_data", "--limit=0"] depends_on: - redis healthcheck: test: ["CMD-SHELL", "ps aux | grep '[m]essenger:consume' || exit 1"] interval: 10s timeout: 5s retries: 3
关键修改说明
- volumes挂载:将本地项目目录绑定到容器的
/var/www/html,与DDEV web容器保持一致,确保容器能访问项目代码 - working_dir设置:指定工作目录为项目根,避免路径错误
- command调整:移除
exec,直接运行bin/console命令,符合容器内执行逻辑
验证步骤
- 保存修改后的配置文件
- 执行
ddev restart重启项目 - 查看worker容器日志:
ddev logs -s dataupdate-worker,确认无报错 - 检查worker进程状态:
ddev exec -s dataupdate-worker ps aux | grep messenger:consume,确认进程正常运行
内容的提问来源于stack exchange,提问作者Bernard Polman
相关产品推荐
相关产品推荐

