【无标题】

#经过测试,不能使用 ENTRYPOINT ["/modapi/modapi", "1>> /dev/null","2>> ./logs/stderr.log"],原因是虽然这种方案可以
#保证modapi命令为1号程序,能够接收到os的signal信号。但是如果程序core了,会直接导致1号进程core。则docker直接退出并且错误没有写入到
#stderr.log文件中。因此通过start.sh传递terminated信号,同时可以保证core时候堆栈信息可以写入到stderr.log中
CMD ["/bin/sh", "/modapi/start.sh"]
#!/bin/sh
# Define function to forward signals
term_handler() {
  echo "Forwarding SIGTERM to child process"
  kill -TERM "$child_pid"
  wait "$child_pid"
}

# Trap signals
trap term_handler SIGTERM

# Start the child process
/modapi/modapi 1>> /dev/null 2>> ./logs/modapi/stderr.log &
child_pid=$!

# Wait for the child process to exit
wait "$child_pid"
func ShutDownBefore(ctx context.Context, funs ...ShutDownCallBackFun) {
	go func() {
		c := make(chan os.Signal, 1)
		signal.Notify(c, syscall.SIGTERM)
		oscall := <-c
		log.Errorf(ctx, "get os signal:%v", oscall)
		for _, fun := range funs {
			fun(ctx)
		}
	}()
}

你可能感兴趣的:(后端)