IntelliJ 在 Docker 中调试 Java 应用程序
Posted
技术标签:
【中文标题】IntelliJ 在 Docker 中调试 Java 应用程序【英文标题】:IntelliJ debug Java application in Docker 【发布时间】:2019-12-15 03:52:33 【问题描述】:我是新手。你能告诉我如何设置一个在 Docker 中运行的调试 Java 程序吗?
该项目是在 Maven 的帮助下构建的,之后 Docker 使用*.war
运行程序。
据我了解,必须远程推送 IntelliJ 进行调试。
docker-compose.yml:
# myapp (Wildfly + Keycloak + myapp)
myapp-myapp:
image: myapp/wildfly-myapp:wf11
container_name: myapp-myapp
depends_on:
- myapp-postgres
- myapp-mailhog
environment:
TZ : Europe/Paris
KEYCLOAK_URL: http://localhost:8080/auth
WILDFLY_PROXY_ADDRESS_FORWARDING: "true"
JAVA_OPTS:
DB_CONNEXION_URL: jdbc:postgresql://myapp-postgres:5432/myapp_db
DB_CONNEXION_URL_DELIMITER: "|"
DB_HOST: myapp-postgres
DB_NAME: $DB_NAME
DB_PASSWORD: $DB_PASSWORD
DB_USER: $DB_USER
KEYCLOAK_DB_CONNEXION_URL: jdbc:postgresql://myapp-postgres:5432/keycloak
KEYCLOAK_DB_CONNEXION_URL_DELIMITER: "|"
KEYCLOAK_DB_USER : keycloak
KEYCLOAK_DB_PASSWORD : keycloak
KEYCLOAK_DB_NAME : keycloak
KEYCLOAK_DB_HOST: postgres
APP_CLUSTER: "false"
JGROUPS_EXTERNAL_ADDRESS: 10.178.27.30
JGROUPS_TCP_EXTERNAL_PORT: 7600
JGROUPS_TCP_BIND_PORT: 7600
JGROUPS_DEFAULT_STACK: tcpping
JGROUPS_INITIAL_HOSTS: "10.178.27.30[7600]"
WILDFLY_CLUSTER_PASSWORD:
WILDFLY_NODE_NAME: myapp-master
SMTP_HOST: myapp-mailhog
SMTP_PORT: 1025
SMTP_FROM: $SMTP_FROM
SMTP_USERNAME: ""
SMTP_PASSWORD: ""
myapp_LOG_LEVEL: "ALL"
myapp_DEBUG_LEVEL: "ALL"
volumes:
- ./myapp/data:/opt/jboss/myappdata
- ./myapp/logs:/opt/jboss/wildfly/standalone/log
- ./myapp/deployments:/opt/jboss/wildfly/standalone/deployments
- ./myapp/configuration/myapp-admin.properties:/opt/jboss/wildfly/standalone/configuration/myapp-admin.properties
- $ST_SRC:/opt/jboss/myappdata/$PROVIDER_CODE/frontend/st
- $CC_SRC:/opt/jboss/myappdata/$PROVIDER_CODE/frontend/cc
- $SC_SRC:/opt/jboss/myappdata/$PROVIDER_CODE/frontend/sc
ports:
- "8080:8080"
- "7600:7600"
【问题讨论】:
您是自己创建 Dockerfile 还是使用库? 这可能会有所帮助Debug java application running in Docker from IntelliJ 嗯,您可以在JAVA_OPTS:
之后在我的答案中添加Java Arg,并在ports:
下包含端口8000
【参考方案1】:
您可以使用以下 JVM-Argument 启用远程调试
-agentlib:jdwp=transport=dt_socket,server=y,address=8000,suspend=n
然后您可以使用Run
-> Attach to process
附加 Intellij 调试器
您的应用程序应指定端口(在本例中为 8000)
更多信息请参见here
对于这个例子(Docker-Compose with Wildfly)
environment:
...
JAVA_OPTS: -agentlib:jdwp=transport=dt_socket,server=y,address=8000,suspend=n
...
ports:
- "8000:8000"
...
一般情况
码头工人
要在 Docker 中使用,您还必须公开端口
EXPOSE 8000
ENTRYPOINT ["java", "-jar", "-agentlib:jdwp=transport=dt_socket,server=y,address=8000,suspend=n", "/path/to/my/java.jar"]
然后
docker run -p 8000:8000 <image>
IntelliJ(从 2019.1 开始)
这个过程现在可以由 IntelliJ 自动完成 https://blog.jetbrains.com/idea/2019/04/debug-your-java-applications-in-docker-using-intellij-idea/
【讨论】:
我有这个像一个容器:46aa7c658b99 myapp/wildfly-myapp:wf11 "/opt/jboss/docker-e…" 22 小时前 5 小时前(健康)1883/tcp,0.0.0.0 :7600->7600/tcp, 4000/tcp, 9990/tcp, 0.0.0.0:8080->8080/tcp 如何将代码从 IntelliJ 获取到 Docker 容器中?你写了一个 Dockerfile 吗?你使用 Maven 插件吗? 我使用docker-compose up
运行所有容器
那么您使用的容器不是您自己创建的吗?如果是,哪些容器?
如果您在问题帖子中包含所有步骤和 docker-compose.yml,这将非常有帮助以上是关于IntelliJ 在 Docker 中调试 Java 应用程序的主要内容,如果未能解决你的问题,请参考以下文章
使用 Intellij/Rubymine 在 docker 中调试 rails 应用程序
在 IntelliJ IDEA 的 docker 容器中远程调试 Java 9
Docker容器中的Intellij CE 2018.2 + SBT:远程调试断点无法正常工作