答案:是
解决方案:
1 JVM钩子调用,在关闭前处理一些事情
2 docker发出kill命令时我们可以发一个信号让JVM调用钩子,不是直接关闭
可以验证一下:
先写个main
package com.example.miniot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MiniotApplication {
public static void main(String[] args) {
new MiniotApplication().check();
SpringApplication.run(MiniotApplication.class, args);
System.out.println(
"主线程。。。。"
);
// Runtime.getRuntime().halt(2);
// System.exit(1);
}
private void check() {
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
System.out.println(
"钩子 1 kill pid 也就是kill -15 pid ,将会调用钩子函数ShutdownHook,一般ShutdownHook中会进行一些操作,比如保存数据,关闭连接等"
);
}));
}
}
maven package 一个包。包名自己改一下
写一个dockerfile
## 基础镜像java
FROM openjdk:8
#将本地文件挂载到当前容器
VOLUME /tmp
#复制jar文件和配置文件所在的目录到容器里
ADD miniot1.jar /app.jar
# ADD conf /conf
#声明需要暴露的端口
EXPOSE 8006
#配置容器启动后执行的命令,并指定使用项目外部的配置文件
ENTRYPOINT ["java", "-Xms256m", "-Xmx256m", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app.jar"]
包和dockerfile上传到服务器或放到目录 /tmp下
docker打成镜像
docker build -t test:001 .
运行
docker run -d --name test --network host --restart=always -v /tmp/rpa-test:/tmp/rpa-test test:001
关闭
docker stop
查容器内的日志
docker logs --tail 300 -f test
另一个操作是发信息号,这里就不说了。