百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

【Java】Vert.x使用Maven构建Docker镜像并上传私库

lipiwang 2024-10-15 18:38 12 浏览 0 评论

当初为了学习Docker和自动化运维方面的知识,在家里的机器中也部署了一整套运维工具。不得不说这Docker镜像几乎就是磁盘杀手,就一个完整的openj9 jdk镜像就已经差不多500MB了。还好不搞Nightly Build,不然一下子空间就全没了。

随着后面做的尝试越来越多,整套环境运行起来越来越臃肿(加了Nexus、加了Gitlab、加了Jenkins、加了Portainer......),这时我不得不考虑更加轻量化的解决方案。直到我发现原来可以通过Maven的Pom配置打包成Docker镜像时,我决定大刀阔斧做了以下修改:

  1. 砍掉Gitlab,自己本机开发本机部署搞什么Gitlab,没多大意义磁盘一坏该没的还是没了;
  2. 砍掉Nexus,代码版本库都没有了还要代码包管理库干什么;
  3. 砍掉Jenkins,都可以用Maven直接命令打包完成,就不需要Jenkins做持续集成了;
  4. 砍掉Portainer,这个可砍可不砍,纯粹是因为资源不够了所以砍掉了而已;

一套操作下来发现,居然还能战几年。果然是“穷”则变变则通。

要实现Maven构建Docker镜像关键还在于Pom文件,我这边的Pom文件是这样写的:

<properties>
	...
	
	<!-- docker参数 -->
    <!-- 这里是maven docker组件的版本号 -->
	<docker-maven.version>0.36.0</docker-maven.version>
    <!-- 这里是镜像仓库的仓库名称 -->
	<docker.image.registry>vtx</docker.image.registry>
    <!-- 这里是目标仓库的ip和端口地址 -->
	<target-ip.repo>192.168.100.152:5000</target-ip.repo>
	<!-- docker私有仓库机器的tcp2375端口指向 -->
	<docker-host.name>tcp://192.168.100.152:2375</docker-host.name>
    <!-- 这里是私有仓库用户名 -->
	<docker.username>yzh</docker.username>
    <!-- 这里是私有仓库密码 -->
	<docker.password>Pwd</docker.password>
    ...
</properties>
...

<build> 
  <plugins>
    ... 
    <plugin> 
      <groupId>io.fabric8</groupId>  
      <artifactId>docker-maven-plugin</artifactId>  
      <version>${docker-maven.version}</version>  
      <configuration> 
        <!-- 远程docker守护进程url -->  
        <dockerHost>${docker-host.name}</dockerHost>  
        <!-- 远程push权限 -->  
        <authConfig> 
          <push> 
            <username>${docker.username}</username>  
            <password>${docker.password}</password> 
          </push> 
        </authConfig>  
        <images> 
          <image> 
            <!-- 镜像名称(这里注意要包含远程目标仓库的访问前缀) --> 
            <!-- 例子中的是192.168.100.152:5000,不然它会找docker.io上面的 --> 
            <name>${target-ip.repo}/${docker.image.registry}/${project.artifactId}:${project.version}</name>  
            <!-- 构建内容 -->  
            <build> 
              <!-- 基础镜像(采用了jdk11 openj9版本) -->  
              <from>adoptopenjdk:11-openj9</from>  
              <!-- 作者名称 -->  
              <maintainer>yzh0623@outlook.com</maintainer>  
              <!-- 镜像开放端口 -->  
              <ports> 
                <port>8197</port> 
              </ports>  
              <!-- 镜像内挂载目录 -->  
              <volumes> 
                <volume>/tmp</volume> 
              </volumes>  
              <!-- 镜像内工作目录 -->  
              <workdir>/usr/local/share</workdir>  
              <!-- dockerfile中jar包启动参数 -->  
              <entryPoint> 
                <exec> 
                  <arg>java</arg>  
                  <arg>-jar</arg>  
                  <arg>${project.artifactId}-${project.version}.jar</arg>  
                  <arg>-XX:MaxGCPauseMillis=200</arg>  
                  <arg>-Xloggc:/tmp/${project.artifactId}/gc.log</arg>  
                  <arg>-XX:+PrintGCDetails</arg>  
                  <arg>-XX:+PrintGCDateStamps</arg>  
                  <arg>-XX:+UnlockExperimentalVMOptions</arg>  
                  <arg>-XX:+UseG1GC</arg>  
                  <arg>-Djava.security.egd=file:/dev/./urandom</arg>  
                  <arg>-XX:+UseCGroupMemoryLimitForHeap</arg>  
                  <arg>-XX:MaxRAMFraction=1</arg>  
                  <arg>-XX:+HeapDumpOnOutOfMemoryError</arg>  
                  <arg>-cluster</arg> 
                </exec> 
              </entryPoint>  
              <!-- 原始包位置与镜像的前期准备 -->  
              <assembly> 
                <!-- 上传模式 -->  
                <mode>dir</mode>  
                <!-- 上传目录 -->  
                <targetDir>/usr/local/share</targetDir>  
                <!-- jar包描述 -->  
                <descriptorRef>artifact</descriptorRef> 
              </assembly> 
            </build> 
          </image> 
        </images> 
      </configuration>  
      <!-- docker操作执行 -->  
      <executions> 
        <!-- 镜像打包(本地产生镜像) -->  
        <execution> 
          <id>push-image</id>  
          <!-- 对应maven指令package -->  
          <phase>package</phase>  
          <!-- 执行docker命令build\push -->  
          <goals> 
            <!-- 先build,后push -->  
            <goal>build</goal>  
            <goal>push</goal> 
          </goals>  
          <configuration>  
            <imageName>${target-ip.repo}/${docker.image.registry}/${project.artifactId}:${project.version}</imageName> 
          </configuration> 
        </execution> 
      </executions> 
    </plugin> 
  </plugins> 
</build>
复制代码

(这里我是针对Vert.x应用进行直接Docker构建,如果是Springboot项目还需要进行一些调整。) 在一开始的时候可能各位还会报出以下这个问题,如下图:

Failed to execute goal io.fabric8:docker-maven-plugin:0.33.0:build (build-image) on project phw2-bi-vtx: Cannot create docker access object: Connect to 127.0.0.1:2375 [/127.0.0.1] failed: Connection refused (Connection refused) -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal io.fabric8:docker-maven-plugin:0.33.0:build (build-image) on project phw2-bi-vtx: Cannot create docker access object
复制代码

这个问题有可能是因为2375端口(Docker对外开发端口)没有开启导致的,通过一下语句查看一下2375端口是否有打开:

# 查看2375端口是否开启
nc -vz -w 2 localhost 2375

nc: connectx to localhost port 2375 (tcp) failed: Connection refused
nc: connectx to localhost port 2375 (tcp) failed: Connection refused
复制代码

这个时候需要通过启动特殊镜像进行端口开启,如下图:

docker run -it -d \
--name=socat \
-p 2375:2375 \
-v /var/run/docker.sock:/var/run/docker.sock \
--restart=always \
bobrik/socat:latest \
TCP4-LISTEN:2375,fork,reuseaddr \
UNIX-CONNECT:/var/run/docker.sock
复制代码

接下来就能够正常使用Maven进行构建并上传私库了。

相关推荐

Go语言图书管理RESTful API开发实战

Go(Golang)是最近流行起来,且相对较新的编程语言。它小而稳定,使用和学习简单,速度快,经过编译(原生代码),并大量用于云工具和服务(Docker、Kubernetes...)。考虑到它所带来的...

轻松搞定Golang 中的内存管理(golang设置内存大小)

除非您正在对服务进行原型设计,否则您可能会关心应用程序的内存使用情况。内存占用更小,基础设施成本降低,扩展变得更容易/延迟。尽管Go以不消耗大量内存而闻名,但仍有一些方法可以进一步减少消耗。其中一...

golang实现deepseek 聊天功能(golang deepcopy)

在搭建完deepseek环境后在docker内部署deepseekrag环境,我们可以用golang实现聊天功能。在实现这个功能之前,我们先了解下提示词工程(prompt)。大模型虽然知道的东西多...

golang slice的扩容机制(golang设置内存大小)

在Go语言中,切片(slice)是一种动态数组,其长度可以在运行时改变。当向切片中添加元素时,如果切片的容量不足以容纳新元素,就会触发扩容机制。下面详细介绍Go语言切片的扩容机制。扩容触发条件...

Etcd服务注册与发现封装实现--golang

服务注册register.gopackageregisterimport("fmt""time"etcd3"github.com/cor...

嘿,轻松获取区间内所有日期的Golang小技巧!

在Go语言中,获取两个日期之间的所有日期可以手动实现一个函数来完成。以下是一个示例函数,它会返回一个日期切片,包含从开始日期到结束日期(包括这两个日期)的所有日期:packagemainimpo...

仓颉、Java、Golang性能测试——数组扩容

版本信息仓颉版本0.53.18Golang版本1.22.8Java版本corretto-1.8.0_452源码仓颉packagecangjie_testimportstd.collect...

Golang 58个坑 – 中级篇:36-51(golang cef)

36.关闭HTTP的响应体37.关闭HTTP连接38.将JSON中的数字解码为interface类型39.struct、array、slice和map的值比较40.从panic...

一篇文章学会golang语法,golang简明教程快速入门

Go(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。——Go-wikipedia.org1Go安装最新版本下载地址官方下载https...

运维大神如何使用 Golang 日志监控应用程序

你是如何使用Golang日志监控你的应用程序的呢?Golang没有异常,只有错误。因此你的第一印象可能就是开发Golang日志策略并不是一件简单的事情。不支持异常事实上并不是什么问题,异常在...

Golang操作elasticsearch(golang操作word)

简介开源的Elasticsearch是目前全文搜索引擎的首选,很多日志都是放到elasticsearch里面,然后再根据具体的需求进行分析。目前我们的运维系统是使用golang开发的,需要定时到e...

一文带你看懂Golang最新特性(golang x)

作者:腾讯PCG代码委员会经过十余年的迭代,Go语言逐渐成为云计算时代主流的编程语言。下到云计算基础设施,上到微服务,越来越多的流行产品使用Go语言编写。可见其影响力已经非常强大。一、Go语言发展历史...

Golang 最常用函数(备用查询)(golang函数和方法)

hello.gopackagemainimport"fmt"funcmain(){fmt.Println("Hello,world!")}直...

Golang:将日志以Json格式输出到Kafka

在上一篇文章中我实现了一个支持Debug、Info、Error等多个级别的日志库,并将日志写到了磁盘文件中,代码比较简单,适合练手。有兴趣的可以通过这个链接前往:https://github.com/...

如何从 PHP 过渡到 Golang?(php转go需要多久)

我是PHP开发者,转Go两个月了吧,记录一下使用Golang怎么一步步开发新项目。本着有坑填坑,有错改错的宗旨,从零开始,开始学习。因为我司没有专门的Golang大牛,所以我也只能一步步自己去...

取消回复欢迎 发表评论: