【发布时间】:2017-08-04 09:38:26
【问题描述】:
我在 docker 容器中运行 spring 应用程序时遇到问题(spring 和 docker 在我的环境中都有最新版本)。 我希望应用程序类 AnalysisServiceBootstrap 有一个健康的生命周期:在创建 AnalysisServiceBootstrap 之后使用方法 start() 运行初始化代码,并在破坏 AnalysisServiceBootstrap 之前运行方法 stop() (我想在有人时运行 stop() 代码停止应用程序)。
我有以下代码:
package com.pack;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.web.SpringBootServletInitializer;
@SpringBootApplication
public class AnalysisServiceBootstrap {
// called OK on docker "start <containerId>"
@PostConstruct
public void start() throws Exception {
// some init code
}
// NOT called on "docker stop <containerId>"
@PreDestroy
public void stop() {
// some destroy code
}
public static void main(String[] args) {
SpringApplication.run(AnalysisServiceBootstrap.class, args);
}
}
由于某种原因,我无法让方法 stop() 在 docker stop 上运行。 我尝试了 stackoverflow 和其他资源上提供的几种方法,但它们都不适合我。
我很高兴有适合您的代码(不仅仅是一些时尚建议)。
这几乎是我的 docker 文件:
FROM *********:6556/service-jvm
ARG SERVICE_JAR_FILE
ENV SERVICE_NAME service
ENV HTTP_PORT 603
ENV HTTPS_PORT 604
ENV SERVICE_JAR /opt/my/project/${SERVICE_JAR_FILE}
EXPOSE ${HTTP_PORT} ${HTTPS_PORT}
COPY ${SERVICE_JAR_FILE} /opt/my/project/${SERVICE_JAR_FILE}
CMD java -Xms1024m -Xmx1024m -dump:"/opt/my/project/dumppath" -javaagent:/opt/my/project/agent.jar -Djav.awt.headless=true -jar ${SERVICE_JAR}
但请您在此处发布您拥有的任何工作 docker 文件。
非常感谢。
【问题讨论】:
-
添加您的
Dockerfile并展示您是如何创建容器(gradle 或 maven) -
请不要将其他信息添加为 cmets,而是编辑您的问题。
-
在
java命令前加上exec所以CMD exec java这应该使它成为一个应该接收信号的后台进程。否则它会作为不接收信号的普通 bash 进程运行。另见ctl.io/developers/blog/post/…
标签: java spring docker spring-boot sigkill