應用遷移中遇到一些有特殊要求的應用,好比須要經過交互生成一些新的config文件,而後啓動應用須要依賴於這些文件,這樣在構建鏡像的時候基本上是沒有辦法把這些文件固定的,由於他須要根據運行環境去進行動態註冊生成,目前的解決方法以下:java
1.寫一段支持交互的python腳本,生成配置python
#!/usr/bin/python import subprocess import time import fcntl import os p = subprocess.Popen(["java","-jar","a.jar"],stdin=subprocess.PIPE,stdout=subprocess.PIPE) flags = fcntl.fcntl(p.stdout,fcntl.F_GETFL) fcntl.fcntl(p.stdout,fcntl.F_SETZFL,flags| os.O_NONBLOCK) time.sleep(2) print p.stdout.read() p.stdin.write("1\r\n")
開始調試時屏幕一直處於blocking狀態,後來同事高手指導下加入NONBLOCK後才經過。web
2.將python腳本放入tomcat運行的catalina.sh,讓他在啓動容器後,啓動腳本一開始就運行spring
================================================apache
另外在應用遷移的時候遇到的另外一個問題tomcat
代碼相似cookie
Cookie cookie = new Cookie("testCookie", "test"); cookie.setDomain(".test.com"); cookie.setPath("/"); cookie.setMaxAge(36000); resp.addCookie(cookie);
在tomcat 8.5的環境下報錯mvc
java.lang.IllegalArgumentException: An invalid domain [.test.com] was specified for this cookie at org.apache.tomcat.util.http.Rfc6265CookieProcessor.validateDomain(Rfc6265CookieProcessor.java:181) at org.apache.tomcat.util.http.Rfc6265CookieProcessor.generateHeader(Rfc6265CookieProcessor.java:123) at org.apache.catalina.connector.Response.generateCookieString(Response.java:989) at org.apache.catalina.connector.Response.addCookie(Response.java:937) at org.apache.catalina.connector.ResponseFacade.addCookie(ResponseFacade.java:386) at com.cml.mvc.controller.HelloWorld.str(HelloWorld.java:98) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:777) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:706) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85
緣由是 在tomcat8.5上是使用org.apache.tomcat.util.http.Rfc6265CookieProcessorapp
在tomcat8.0上使用的是org.apache.tomcat.util.http.LegacyCookieProcessordom
解決辦法是去掉域名前面的.
Cookie cookie = new Cookie("testCookie", "test"); cookie.setDomain("test.com"); cookie.setPath("/"); cookie.setMaxAge(36000); resp.addCookie(cookie);