アプリケーションは春ブート2.0.4とJava 8で構築されており、ドッカー/ドッカー作曲で実行されたときに私のプロジェクトはJavaの11で春ブーツ2.1.0へのJava 8で春ブーツ2.0.4から移行され、@PostConstruct
-annotated方法でした呼ばれるが、春のブート2.1.0とJavaの11への移行後@PreDestroy
-annotatedメソッドが呼び出されなくなりました。
私は実装に注釈からの切り替えしようとしているInitializingBean
とDisposableBean
説明したように、ここではなく、DisposableBean.destroy
メソッドが呼び出されません。
私も同じ結果で、javax.annotation-APIバージョン1.3.2への依存関係を追加しようとしています。
再現方法:
ライフサイクル豆と最小限のSpringアプリケーションを作成します。
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;
@Component
public class Life implements InitializingBean, DisposableBean {
@Override
public void destroy() throws Exception {
System.out.println("--- Life.shutdown");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("--- Life.startup");
}
}
ターゲットサブフォルダからSpringアプリケーションを起動します。
cd target
java -jar demo-0.0.1-SNAPSHOT.jar
アプリケーションはCtrlキー+ Cを使用して停止した場合、DisposableBean.destroyが呼び出されます。
親フォルダに戻ります:
cd ..
Mavenを使ってSpringアプリケーションを起動します。
mvn spring-boot:run
アプリケーションはCtrlキー+ Cを使用して停止した場合、DisposableBean.destroyが呼び出されます。
Dockerfile:
FROM openjdk:11.0.1-jre-slim
COPY target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT java -jar /app.jar
ビルド、実行、および停止ドッカーの画像:
docker build -t demo .
docker run -p 8080:8080 demo
docker ps
docker stats 3ca5b804ab13
docker stop 3ca5b804ab13
docker logs 3ca5b804ab13
アプリケーションがドッキングウィンドウの停止を使用して停止した場合、DisposableBean.destroyは呼び出されません。
ドッカー-compose.yml:
demo:
image: demo
ports:
- '8080:8080'
ドッカー作曲を(OpenShiftをシミュレート)を使用して、ドッカーイメージを実行します。
docker-compose up
docker-compose down
demo_demo_1 exited with code 137
アプリケーションがドッキングウィンドウ・コンダウンを使用して停止した場合、DisposableBean.destroyは呼び出されません。
私は、コンテナが殺される前に、10秒の遅延があるので、それは、SIGKILLを発行する前にドッカーがSIGTERMをしようとしていると思われます。
私は(溶液見つけたと思う、このブログのエントリを使用するexecのフォームの代わりに、シェル形Dockerfileで非常にドッカー問題そのSIGTERMはjavaプロセスに当たることはなく、任意の子プロセスにはない前方の信号処理を行い、bashのプロセスを(:) )。
- (/ binに/ SH -Cシェルで実行される)シェル型:
ENTRYPOINT java -jar /app.jar
- (シェルなしで実行)Execの形態:
ENTRYPOINT ["java", "-jar", "/app.jar"]