java - IntelliJ 在 Docker 中调试 Java 应用程序
问题描述
我是新手。你能告诉我如何设置一个在 Docker 中运行的调试 Java 程序吗?
该项目是在 Maven 的帮助下构建的,之后 Docker 使用它*.war
来运行程序。据我了解,必须远程推送 IntelliJ 进行调试。
码头工人-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"
解决方案
您可以使用以下 JVM-Argument 启用远程调试
-agentlib:jdwp=transport=dt_socket,server=y,address=8000,suspend=n
然后您可以附加 Intellij 调试器Run
->Attach to process
您的应用程序应该指定端口(在这种情况下为 8000)
请参阅此处了解更多信息
对于这个例子(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/
推荐阅读
- email - target="_blank" 没有打开带有“mailto:”链接的新标签
- c# - 如何在 Avalonia 中为样式创建单独的文件?
- distributed-computing - 使用 rel=canonical 内容分布在 2 个域名下的 2 个服务器之间
- typescript - Typescript 为项目或该项目的工厂打开通用类型
- c# - 如何计算(评估)复杂的数学字符串
- python - Python GitLab 如何获取项目中的所有文件名?
- python - 无法执行使用 tensorflow 创建的回调函数
- jackson - Quarkus Jackson InvalidDefinitionException 找不到类型 [简单类型,类 java.math.BigDecimal] 的(映射)密钥反序列化器
- swift - UIActivityViewController 的标题是怎么设置的?
- python - 获取指向字典值的指针(python)