如何在Docker环境中配置WebStorm调试Directus扩展?
我正尝试在WebStorm中配置运行/调试环境以调试Directus扩展,Directus运行在由docker-compose.yml管理的Docker容器内。尽管遵循了WebStorm文档,启动调试器时仍遇到错误。不启用调试时,相同配置运行正常,可正常访问Directus控制台,说明运行配置正确,但调试存在配置问题或兼容性问题。
WebStorm运行/调试配置

Docker镜像配置
FROM directus/directus:10.13 USER root RUN corepack enable \ && corepack prepare pnpm@8.1.1 --activate \ # Currently required, we'll probably address this in the base image in future release && chown node:node /directus RUN mkdir -p /directus/directus-config RUN chown -R node:node /directus/directus-config ENV PNPM_HOME="/pnpm" ENV PATH="$PNPM_HOME:$PATH" RUN pnpm install -g tsx USER node RUN pnpm install directus-extension-sync RUN pnpm install directus-sync
Docker Compose配置
jp_backend: container_name: ${COMPOSE_PROJECT_NAME}_jp_backend user: ${UID}:${GID} build: context: ./ dockerfile: docker/backend/Dockerfile env_file: - .env ports: - '${DOCKER_BACKEND_PORT}:8055' volumes: - ./directus/extensions:/directus/extensions - ./directus/directus-config:/directus/directus-config - ./directus/start.ts:/directus/start.ts - ./directus/start.js:/directus/start.js - './.env:/directus/.env:ro' - ./docker/backend/.bash_history:/home/node/.ash_history networks: - backend_network - traefik_network depends_on: - jp_database labels: - 'traefik.enable=true' - 'traefik.http.routers.${COMPOSE_PROJECT_NAME}-backend.entrypoints=http' - 'traefik.http.routers.${COMPOSE_PROJECT_NAME}-backend.rule=Host(`${COMPOSE_PROJECT_NAME}.backend.${DOMAIN}`)' - 'traefik.http.middlewares.${COMPOSE_PROJECT_NAME}-backend-https-redirect.redirectscheme.scheme=https' - 'traefik.http.routers.${COMPOSE_PROJECT_NAME}-backend.middlewares=${COMPOSE_PROJECT_NAME}-backend-https-redirect' - 'traefik.http.routers.${COMPOSE_PROJECT_NAME}-backend-secure.entrypoints=https' - 'traefik.http.routers.${COMPOSE_PROJECT_NAME}-backend-secure.rule=Host(`${COMPOSE_PROJECT_NAME}.backend.${DOMAIN}`)' - 'traefik.http.routers.${COMPOSE_PROJECT_NAME}-backend-secure.tls=true' - 'traefik.http.routers.${COMPOSE_PROJECT_NAME}-backend-secure.tls.certresolver=http' - 'traefik.http.routers.${COMPOSE_PROJECT_NAME}-backend-secure.service=${COMPOSE_PROJECT_NAME}-backend' - 'traefik.http.services.${COMPOSE_PROJECT_NAME}-backend.loadbalancer.server.port=8055' - 'traefik.docker.network=traefik_network'
调试启动错误

tsx /directus/start.ts WARN[0000] /home/happyhevia/JP/jobs-paragon-backend/docker-compose.yml: `version` is obsolete WARN[0000] /home/happyhevia/.cache/JetBrains/WebStorm2024.1/tmp/docker_compose/docker-compose.override.881.yml: `version` is obsolete [+] Running 2/0 ✔ Container dev_jp_database Running 0.0s ✔ Container dev_jp_backend Recreated 0.0s Attaching to dev_jp_backend dev_jp_backend | Debugger listening on ws://127.0.0.1:38727/ddbd5270-8cfe-4cd1-b203-8505e794968c dev_jp_backend | For help, see: https://nodejs.org/en/docs/inspector dev_jp_backend | [debugConnectionForwarder] Error connecting to inspector {"port":38727} Error: connect ECONNREFUSED ::1:38727 dev_jp_backend | at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1555:16) { dev_jp_backend | errno: -111, dev_jp_backend | code: 'ECONNREFUSED', dev_jp_backend | syscall: 'connect', dev_jp_backend | address: '::1', dev_jp_backend | port: 38727 dev_jp_backend | }
已尝试的解决方法
- 在容器内启动Node.js检查,未获得明确线索
- 替换tsx为Node.js运行启动脚本,问题未解决
- 测试Node.js Alpine v20镜像配置类似调试环境可正常工作,推测问题出在Directus镜像或其配置
- 检查Directus镜像,怀疑存在阻止调试器连接的设置,但无法定位具体原因
解决思路建议
强制调试器监听所有接口
错误显示调试器监听127.0.0.1,但WebStorm尝试连接::1(IPv6回环地址),可能容器内IPv6配置有问题。修改启动命令,添加--inspect=0.0.0.0:9229参数,让调试器监听所有网络接口,而非仅回环地址。比如在WebStorm的运行配置中,将命令改为tsx --inspect=0.0.0.0:9229 /directus/start.ts,同时在Docker Compose中映射调试端口9229:9229。调整容器用户权限
当前Docker Compose中指定了user: ${UID}:${GID},可能导致调试器无法绑定端口。尝试注释掉该行,使用镜像默认的node用户运行,确认是否是权限问题。检查Directus启动逻辑
Directus镜像可能有自定义的启动脚本,覆盖了调试参数。可以进入容器查看/directus/start.sh或相关启动脚本,确认是否有禁止调试或修改调试端口的逻辑。使用WebStorm的远程调试配置
放弃Docker Compose直接调试,改为手动启动容器并映射调试端口,然后在WebStorm中配置Remote Node.js Debug,指定容器的IP和调试端口(如9229)。更新Directus镜像版本
当前使用的是10.13版本,尝试升级到最新稳定版,可能官方已修复调试相关的兼容性问题。
内容的提问来源于stack exchange,提问作者Jérémie Esteves

