背景

手头有个任务,需要用java通过jni调用一个开源算法库gmssl的功能,但是gmssl只提供了源码,需要编译后才能使用。按照通常的做法,我们会部署好centos的虚拟机和开发环境,安装好gmssl的依赖环境,然后再基于这个部署好的开发环境进行开发和调试。

这样的做法,会在开发和部署过程中会出现一些问题:

  • 对虚拟机做的改动,没有效记录
  • 虚拟机的体积过大,保存麻烦
  • 在生成环境中,需要重新编译部署,比较麻烦

为了解决上面提到的问题,通过引入docker,并支持快速调试。主要思路如下:

  • 使用Dockerfile部署开发环境
  • 在进程的启动脚本中,加入远程调试的指令
  • IDEA配置远程调试的环境
  • IDEA在执行远程调试前,通过maven对Dockerfile生成docker镜像并进行部署
  • docker镜像部署完成后,IDEA能够连接到镜像中,进行调试

操作步骤

Dockerfile内容

#build docker build -t 10.10.8.166:5000/gmssl .

FROM 10.10.8.166:5000/centos-java:latest

RUN yum -y update
RUN yum install -y unzip
RUN yum install -y gcc
RUN yum install -y openssl-devel
RUN yum install -y perl RUN wget https://codeload.github.com/guanzhi/GmSSL/zip/2.0
RUN unzip 2.0
RUN rm -rf 2.0 WORKDIR "/GmSSL-2.0"
RUN ./config
RUN make && make install ADD maven/test-1.0-SNAPSHOT.jar /opt/test.jar
ADD maven/startup.sh /opt/startup.sh
RUN chmod +x /opt/startup.sh WORKDIR "/opt"
EXPOSE "5005"
ENTRYPOINT ["/opt/startup.sh"]

Pom配置

使用docker-maven-plugin,对docker文件进行打包、发布处理

<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.15.16</version>
<executions>
<execution>
<id>package</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
<execution>
<id>deploy</id>
<phase>deploy</phase>
<goals>
<goal>build</goal>
<goal>push</goal>
</goals>
</execution>
</executions>
<configuration>
<verbose>true</verbose>
<machine>
<name>default</name>
<autoCreate>true</autoCreate>
<createOptions>
<driver>virtualbox</driver>
</createOptions>
</machine>
<images>
<image>
<!-- Artifact Image-->
<name>10.10.8.166:5000/gmssl:${project.version}</name>
<run>
<ports>
<port>5005:5005</port>
</ports>
</run>
<build>
<dockerFileDir>${project.basedir}/docker</dockerFileDir>
<assembly>
<mode>dir</mode>
<inline>
<id>gmssl-it</id>
<fileSets>
<fileSet>
<includes>
<include>*.jar</include>
</includes>
<directory>${project.build.directory}</directory>
<outputDirectory>/</outputDirectory>
</fileSet>
<fileSet>
<includes>
<include>*.sh</include>
</includes>
<directory>${project.build.directory}/classes</directory>
<outputDirectory>/</outputDirectory>
</fileSet>
</fileSets>
</inline>
</assembly>
</build>
</image>
</images>
</configuration>
</plugin>

远程调试配置

为了保证镜像保持最新,需要将before launch设置为:

  • mvn package
  • mvn docker:stop
  • mvn docker:start

执行mvn docker:stop的目的是为了能够在启动前,将之前运行的镜像删除。

startup脚本配置

在startup脚本中,加入远程调试的脚本

#!/bin/bash
java -agentlib:jdwp=transport=dt_socket,address=5005,suspend=y,server=y -cp /opt/*:/opt Main

改进

  • 远程调试的配置修改为mvn package docker:stop docker:start进行加速
  • 远程调试结束后,停止运行镜像

IDEA使用docker进行调试的更多相关文章

  1. docker(常见调试技巧):docker打包镜像调试技巧

    写Dockerfile可以先不指定CMD.ENTRYPOINT等启动命令,只要拷贝就好了 如下: # Dockerfile for basic-app-client # Build with: # d ...

  2. docker网络调试过程

    #1: 添加永久网桥 vi /etc/sysconfig/network-scripts/ifcfg-br0 DEVICE=br0 TYPE=Bridge BOOTROTO=static IPADDR ...

  3. Visual Studio 2017 调试 windows server 2016 Docker Container

    网上很多文章都是在win10下,用Docker for windows工具进行Docker的安装部署的.用知道windows server 2016已经原生支持Docker了,其windows Con ...

  4. 修复docker pull image failed

    修复docker pull image failed docker pull报错 message":"Get https://n6-026-137.byted.org/v1/_pi ...

  5. Docker基础入门及示例

    Docker近几年的发展可谓一日千里,特别从是2013年随着一个基于LXC的高级容器引擎开源,到现在,其在linux和windows上都有了很好的支持,并且已经有很多公司将docker用于实际的生产环 ...

  6. Docker的使用初探(二):Docker与.NET Core的结合

    目录 Docker的使用初探(二):Docker与.NET Core的结合 添加Dockefile 1. 在创建项目时添加 2. 手动添加 3. 容器业务流程协调控制程序支持 Dockefile语法 ...

  7. 使用IEDA远程调试

    下面演示在docker中调试代码. 使用vulhub作为演示. 下载vulhub,进入vulhub/fastjson/vuln/ 编辑docker-compose.yml ,在最后新建一行加入  - ...

  8. ASP.NET Core 3.0 : 二十八. 在Docker中的部署以及docker-compose的使用

    本文简要说一下ASP.NET Core 在Docker中部署以及docker-compose的使用  (ASP.NET Core 系列目录). 系统环境为CentOS 8 . 打个广告,求职中.. 一 ...

  9. GDB 调试 .NET 程序实录 - .NET 调用 .so 出现问题怎么解决

    注:本文重要信息使用 *** 屏蔽关键字. 最近国庆前,项目碰到一个很麻烦的问题,这个问题让我们加班到凌晨三点. 大概背景: 客户给了一些 C语言 写的 SDK 库,这些库打包成 .so 文件,然后我 ...

随机推荐

  1. 【HDOJ】5446 Unknown Treasure

    1. 题目描述题目很简单,就是求$C(n,m) % M$. 2. 基本思路这是一道应用了众多初等数论定理的题目,因为数据范围较大因此使用Lucas求$C(n,m) % P$.而M较大,因此通过$a[i ...

  2. Charles是mac的iddler抓包工具

    windows下面我们经常使用 Fiddler 抓包工具进行代理等一系列操作.然而,在 Mac 下 http://en.softonic.com/s/java-se-6:mac

  3. 线程中无法实例化spring注入的服务的解决办法

    问题描述 在Java Web应用中采用多线程处理数据,发现Spring注入的服务一直报NullPointerException.使用注解式的声明@Resource和XML配置的bean声明,都报空指针 ...

  4. HDU 2610 (自己完全找不到思路) Sequence one

    搜索虐我千百遍,我待搜索...好吧,我还木有初恋 题意: 我开始理解题意就理解偏了,Orz 题中有n个元素构成的序列,求出前p个非递减子序列.子序列是先按长度排序的,然后按原序列先后位置排序的. 这里 ...

  5. ASP.NET MVC 实现二级域名

      自从微软发布 ASP.NET MVC 和routing engine (System.Web.Routing)以来,就设法让我们明白你完全能控制URL和routing,只要与你的applicati ...

  6. ASP.NET vs MVC vs WebForms

    许多ASP.NET开发人员开始接触MVC认为MVC与ASP.NET完全没有关系,是一个全新的Web开发,事实上ASP.NET是创建WEB应用的框架而MVC是能够用更好的方法来组织并管理代码的一种更高级 ...

  7. Js内置对象的应用

    Boolean.Number.Objectfunction对象    另一种写法:        var add=new Function("x","y",&q ...

  8. Android Terminal telnet windows

    /******************************************************************************************** * Andr ...

  9. 【转】Qt多线程操作界面---在QThread更新QProgressBar

    #include <QApplication> #include <QThread> #include <QMainWindow> #include <QPr ...

  10. maven的settings.xml详细说明

    转自:http://writeblog.csdn.net/ <?xml version="1.0" encoding="UTF-8"?> <s ...