首页 > 解决方案 > Dart/Docker - VSCode | 附加到docker容器的dart进程时如何在本地代码中设置断点

问题描述

最近我一直在涉足飞镖服务器。我想让所有东西都被 dockerized 用于调试目的,并可能最终用于发布目的。我有一台在 docker 容器中成功服务的服务器。launch.json通过使用 dart 扩展附带的 dart/attach 方法并设置一个enable-vm-service=<port>on,我成功地附加到 vscode 中的进程dart run并确保该端口在我的 docker-compose 中公开。附加后,我无法从本地计算机添加任何断点。有趣的是,未捕获的异常按预期中断,向我展示了它们失败的位置,但是打开以显示断点的文件似乎来自容器。关于如何让断点在我的本地机器上工作的任何想法?方向就足够了,解决方案将是一个加号:D 旁注。我在窗户上。

码头工人-compose.yml

version: '3'

services:
  api:
    build:
      context: .
      dockerfile: Dockerfile

    env_file: .env

    volumes:
      - ./bin:/app/bin

    ports:
      - "${HOST_API_BINDING:-8080}:8080"
      - "${VM_SERVICE_PORT:-10000}:10000"

    restart: unless-stopped

    tty: true

Dockerfile

# Use latest stable channel SDK.
FROM dart:stable AS build

# Resolve app dependencies.
WORKDIR /app
COPY pubspec.* ./
RUN dart pub get

# Copy app source code (except anything in .dockerignore) and AOT compile app.
COPY . .
RUN dart pub get --offline

ENTRYPOINT bash

服务器启动命令:

dart run --enable-vm-service=10000 ./bin/server.dart

服务器.dart

import 'dart:io';

import 'dart:developer' as dev;
import 'package:shelf/shelf.dart';
import 'package:shelf/shelf_io.dart';
import 'package:shelf_router/shelf_router.dart';

// Configure routes.
final _router = Router()
  ..get('/', _rootHandler)
  ..get('/echo/<message>', _echoHandler);

Response _rootHandler(Request req) {
  return Response.ok('Hello, World!\n');
}

Response _echoHandler(Request request) {
  var message = request.params['message'];
  return Response.ok('$message\n');
}

void main(List<String> args) async {
  // For running in containers, we respect the PORT environment variable.\
  var server = await initServer();

  final info = await dev.Service.getInfo();
  await Future.delayed(Duration(milliseconds: 100));
  final observatoryUri = info.serverUri;

  print(observatoryUri?.path ?? 'Null');
}

Future<HttpServer> initServer() async {
  // Use any available host or container IP (usually `0.0.0.0`).
  final ip = InternetAddress.anyIPv4;
  // Configure a pipeline that logs requests.
  final _handler = Pipeline().addMiddleware(logRequests()).addHandler(_router);
  final server = await serve(_handler, ip, 8080);
  print('Server listening on ports ${server.port}');
  return server;
}

启动.json

{
  // Use IntelliSense to learn about possible attributes.
  // Hover to view descriptions of existing attributes.
  // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Docker: Attach to Dart Proccess",
      "type": "dart",
      "request": "attach",
    },
  ]
}

标签: dockerdartdocker-composevscode-debugger

解决方案


推荐阅读