如何使用 VSCode 的 Java 调试器调试在 Docker 容器内运行的 Java 应用程序

win*_*rrr 5 docker visual-studio-code

我有一个.tar安装到容器的 Java 应用程序 ( )。容器entrypoint的 启动该应用程序。

Dockerfile(后端文件夹作为卷安装到映像中)

FROM openjdk:11.0.7

ENTRYPOINT /backend/entrypoint.sh
Run Code Online (Sandbox Code Playgroud)

entrypoint.sh

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 -Xmx2048M -jar backend.jar
Run Code Online (Sandbox Code Playgroud)

现在我想使用 VSCode 的调试器来调试正在运行的应用程序。根据 VSCode 官方文档(博客:检查容器),这可以使用命令面板和命令轻松完成Debugger: attach to Node.js process

但在他们的示例中,他们使用 Node.js 服务器。然而,在我的容器中,没有可以将调试器附加到的 Node.js 进程,而且我找不到适用于 Java Spring 应用程序的适当命令。那么如何将 VSCode 的 Java 调试器附加到已经在 Docker 容器内运行的 Java 应用程序呢?

在他们的文档的另一个地方(containers:debug common),他们声明了以下内容:

Docker 扩展当前支持在 Docker 容器中调试 Node.js、Python 和 .NET Core 应用程序。

所以那里没有提到 Java,但在另一个地方(远程:在容器中调试)他们清楚地谈论了 Java 应用程序:

例如,将其添加到 .devcontainer/devcontainer.json 将设置 Java 主路径: "settings": { "java.home": "/docker-java-home" }

小智 7

我有一个 Spring Boot 应用程序在openjdk:11-jre-slim容器中运行,并且能够使用以下配置成功调试它。

首先,在运行容器时设置 jvm args。您可以通过 Entrypoint.sh 执行此操作,但我决定覆盖 docker-compose 中的容器入口点。我还公开了调试端口。

ports: 
  - 5005:5005
entrypoint: ["java","-agentlib:jdwp=transport=dt_socket,address=*:5005,server=y,suspend=n","-jar","app.jar"]
Run Code Online (Sandbox Code Playgroud)

然后将此配置添加到 vscode 中的 launch.json 中:

{
    "type": "java",
    "name": "Debug (Attach)",
    "projectName": "MyProjectName",
    "request": "attach",
    "hostName": "127.0.0.1",
    "port": 5005
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以启动容器并在 VScode 中的“运行和调试”下选择“调试(附加)”。这将开始带有断点、变量等的典型调试会话......


Gre*_*lds 1

如果你像这样设置你的运行命令

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000 -jar App.jar 
Run Code Online (Sandbox Code Playgroud)

(或者不管你怎么称呼它,重要的是选项)

然后让您的 docker 容器公开该端口。我通常使用 docker compose 文件来执行此操作,因此您可以在运行时轻松映射端口