前言:
学微服务(springcloud)之前,研究了一下docker集成maven自动部署,遇到了一堆问题,在此整理一下
首先,献上我与chatgpt的对话,这里面包含绝大多数问题(没了chatgpt我怎么活啊?(哭))
主要包含maven插件部分
https://chatgpt.com/share/c5c1b1ba-5775-4b33-8785-130306dc001e
主要包含linux部分
https://chatgpt.com/share/b2923509-f80d-4ea9-af81-7a88563a639e
参考博客:三种自动化构建Docker镜像的Maven插件使用 - 简书
我选择使用io.fabric8.docker-maven-plugin插件进行配置
io.fabric8.docker-maven-plugin
<build>
<plugins>
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.37.0</version>
<executions>
<!--如果想在项目打包时构建镜像添加-->
<execution>
<id>build-image</id>
<!--触发条件(即打包项目)-->
<phase>package</phase>
<!--触发内容(即build镜像)-->
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<!-- Docker 远程管理地址-->
<dockerHost>${docker.host}</dockerHost>
<images>
<image>
<!--定义镜像名称-->
<name>${project.name}:${project.version}</name>
<!--定义镜像构建行为(这里的写法其实相当于写dockerfile)-->
<build>
<!--定义基础镜像-->
<from>openjdk:17</from>
<!--定义参数,这里其实没必要,如果用到Dockerfile来定义镜像行为可能会用到-->
<args>
<JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
</args>
<!--定义哪些文件拷贝到容器中-->
<assembly>
<!--定义拷贝到容器的目录-->
<targetDir>/</targetDir>
<!--只拷贝生成的jar包-->
<descriptorRef>artifact</descriptorRef>
</assembly>
<!--定义容器启动命令-->
<entryPoint>["java", "-jar","/${project.build.finalName}.jar"]</entryPoint>
<!--定义维护者-->
<maintainer>idontnow</maintainer>
</build>
</image>
</images>
</configuration>
</plugin>
</plugins>
</build>
坑:
docker镜像名的命名规范:
1,只能包含小写字母、数字、下划线 _
和连字符 -
。
2,必须以字母开头。
3,长度范围在 4 到 30 个字符之间。
这里说是只能包含小写字母,但是对版本名好像没限制,根据情况而定吧
扩展:dockerfile与pom.xml的联动
1,需要在项目的根目录新建名为“Dockerfile”的文本文件
2,编辑文本文件内容,这里将上面pom.xml中build内的配置转为Dockerfile的写法
# 该镜像需要依赖的基础镜像
FROM openjdk:17
# 将当前目录下的jar包复制到docker容器的/目录下
ADD ./hapancake-1.0.0-SNAPSHOT.jar /hapancake-1.0.0-SNAPSHOT.jar
# 声明服务运行在8090端口
EXPOSE 8090
# 指定docker容器启动时运行jar包
#COPY *.jar /hapancake-1.0.0-SNAPSHOT.jar
ENTRYPOINT ["java", "-jar","/hapancake-1.0.0-SNAPSHOT.jar"]
# 指定维护者的名字
MAINTAINER why
ADD的内容直接写死了,如果不想写死,想根据项目构建的内容决定,可以通过编写<args>标签实现
在 Dockerfile 中使用 <args> 标签传递的参数,可以通过 ARG 指令来定义和使用这些参数。以下是一个示例,展示如何在 Dockerfile 中使用 Maven 配置中的 <args> 参数。
<build>
<dockerFile>${project.basedir}/src/main/docker/Dockerfile</dockerFile>
<args>
<JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
</args>
</build>
在Dockerfile中:
# 该镜像需要依赖的基础镜像
FROM openjdk:17
# 定义一个名为 JAR_FILE 的构建参数,默认值为 hapancake-1.0.0-SNAPSHOT.jar
ARG JAR_FILE=hapancake-1.0.0-SNAPSHOT.jar
# 将构建参数 JAR_FILE 的值作为文件名
ADD ./${JAR_FILE} /${JAR_FILE}
# 声明服务运行在8090端口
EXPOSE 8090
# 指定docker容器启动时运行jar包
ENTRYPOINT ["java", "-jar", "/${JAR_FILE}"]
# 指定维护者的名字
MAINTAINER cold
默认值会在构建项目的时候被定义的<agrs>内的同名变量取代