背景

手头有个任务,需要用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. [原]素数筛法【Sieve Of Eratosthenes + Sieve Of Euler】

    拖了有段时间,今天来总结下两个常用的素数筛法: 1.sieve of Eratosthenes[埃氏筛法] 这是最简单朴素的素数筛法了,根据wikipedia,时间复杂度为 ,空间复杂度为O(n). ...

  2. 《大道至简-Team》

    已经学习了<大道至简>两章,我们了解了编程的本质和“懒人”造就了方法.书中没有提供给我们编程的技巧,捷径,而是从别的方面为我们讲解了编程的精义.第三章就为我们引入了“团队”这个概念. 我们 ...

  3. 20.allegro.铺铜[原创]

    1.内层铺铜 --- ---- 选择复制对象 ---- ----- ---- ------ --- --- --- 2.外层铺铜 -- -- 假如没有指定网络: 给这块没有网络的铜皮指定网络 --- ...

  4. hdu4760Good Firewall

    4760 数组模拟就可以了 读的时候可以整数读入 #include <iostream> #include<cstdio> #include<cstring> #i ...

  5. UVa 11481 (计数) Arrange the Numbers

    居然没有往错排公式那去想,真是太弱了. 先在前m个数中挑出k个位置不变的数,有C(m, k)种方案,然后枚举后面n-m个位置不变的数的个数i,剩下的n-k-i个数就是错排了. 所以这里要递推一个组合数 ...

  6. iOS开发UITableView基本使用方法总结1

    UITableView基本使用方法 1.首先,Controller需要实现两个delegate ,分别是UITableViewDelegate 和UITableViewDataSource 2.然后 ...

  7. MySQL Database on Azure - 利用PowerShell快速创建使用数据库服务

    如果您的应用需要通过脚本快速创建一个或多个MySQL数据库,MySQL Database on Azure目前开放了对于PowerShell的支持,可以帮助您快速利用自动化脚本进行数据库服务的创建.管 ...

  8. 【英语】Bingo口语笔记(69) - 脏话的表达

  9. MySQL多表连接

    主要分3种:内连接,外连接,交叉连接 其        他:联合连接,自然连接 1.内联接 典型的联接运算,使用像 =  或 <> 之类的比较运算).包括相等联接和自然联接. 内联接使用比 ...

  10. AIX 第5章 指令记录

    AIX引导过程 AIX不同引导模式 AIX的关闭 AIX的计划任务 AIX服务的管理 AIX的常用日志 POST=Power On Self Test   rc.boot 的三次调用 /etc/ini ...