背景

手头有个任务,需要用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. MySQL工具:管理员必备的10款MySQL工具

    MySQL是一个复杂的的系统,需要许多工具来修复,诊断和优化它.幸运的是,对于管理员,MySQL已经吸引了很多软件开发商推出高品质的开源工具来解决MySQL的系统的复杂性,性能和稳定性,其中大部分是免 ...

  2. WIN764位主机的虚拟机安装的xp系统串口添加

    WIN764位主机的虚拟机安装的xp系统串口添加 我的电脑安装的是64位的WIN7系统,今天为了验证一个问题,需要用到6410开发板,但在安装USB驱动时无法成功安装,估计是S3C6410的USB驱动 ...

  3. Hbase源码分析:Hbase UI中Requests Per Second的具体含义

    Hbase源码分析:Hbase UI中Requests Per Second的具体含义 让运维加监控,被问到Requests Per Second(见下图)的具体含义是什么?我一时竟回答不上来,虽然大 ...

  4. selenium-webdriver(python) (十) 如何处理下拉框

    本节重点 处理下拉框 switch_to_alert() accept() 下拉框是我们最常见的一种页面元素,对于一般的元素,我们只需要一次就定位,但下拉框里的内容需要进行两次定位,先定位到下拉框,再 ...

  5. git(icode)分支及发布管理方式

    如果git(icode)不加管理,可能出现枝节蔓生.四处开放的版本库.到处都是分支,完全看不出主干发展的脉络,造成下图的局面: 为了降低合并和版本管理的成本,团队引入一种值得借鉴的管理方式(link) ...

  6. git remotes

    简单地说,一个remote repository是一个非本地的repo.它可以是在你公司网络上的另外一个git repo,也可以是在internet上,甚至在你本地文件系统中的一个repo,关键点是它 ...

  7. ASP.NET MVC 4 WebAPI. Support Areas in HttpControllerSelector

    This article was written for ASP.NET MVC 4 RC (Release Candidate). If you are still using Beta versi ...

  8. Need to add a caption to a jpg, python can't find the image

    importImage,ImageDraw,ImageFont, os, glob list = glob.glob('*.jpg')for infile in list:print infile f ...

  9. 30条MySQL优化总结

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  10. hadoop NameNode 实现分析

    在hadoop 整体分析中,说过nameNode主要是实现一个 blockID 到对应 dataNode的对应关系映射. 现在分析一下腰实现这个映射,nameNode还需要哪些模块. 1 为了方便用户 ...