docker - 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",
},
]
}
解决方案
推荐阅读
- javascript - Redux:这种全能的动作创建者模式错了吗?
- javascript - 如何在 Vue 2.5 中从带有 html 标签的字符串创建 VNode?
- haskell - 两个 lambda 函数一起是什么意思
- javascript - javascript/html + nodejs
- apache-kafka - Kafka Streams:内部主题分区
- javascript - 将 Firestore 数据检索到数组中不起作用
- ruby-on-rails - 使用数据库中的布尔值填充 options_for_select 中的选定选项
- css - 如何使用 React 和 MaterializeCSS 进行表格分页
- javascript - 如何创建使用 HTML 输入和按钮元素的 JavaScript 随机数生成器?
- go - 如何使用 go/golang 中的 FileServer 函数将文件提供给特定的 url 路径