tl; dr一個RestController正確回答,另一個則不會,如果在Docker容器內運行。SpringBoot @RestController無法從外部碼頭集裝箱訪問
的服務有兩個API alive
@CrossOrigin(origins = "*", maxAge = 3600)
@RestController
public class AliveController {
@RequestMapping(value = "/alive", method = RequestMethod.GET)
public ResponseEntity<?> alive() {
return new ResponseEntity<>(HttpStatus.OK);
}
}
和callcount
。
@CrossOrigin
@RestController
public class CallController {
private static int callCount = 0;
@RequestMapping(value = "/callcount", method = RequestMethod.GET)
public ResponseEntity<?> callCount() {
return new ResponseEntity<>(++callCount, HttpStatus.OK);
}
}
它們都通過碼頭構成運行。
version: '2'
services:
service:
image: my/service
ports:
- "4000:4000"
docker-machine ip
回報192.168.99.100
。
alive
返回一個空的200響應。如預期。
$ curl -i http://192.168.99.100:4000/alive
HTTP/1.1 200
Content-Length: 0
Date: Mon, 22 Aug 2016 17:33:58 GMT
callcount
應該返回一個200響應和每次調用API時會增加的數字。可悲的是,事實並非如此。
$ curl -i http://192.168.99.100:4000/callcount
HTTP/1.1 404
Content-Type: application/hal+json;charset=UTF-8
Transfer-Encoding: chunked
Date: Mon, 22 Aug 2016 17:37:26 GMT
{"timestamp":1471887446871,"status":404,"error":"Not Found","message":"No message available","path":"/callcount"}
在本地運行服務提供預期結果。
$ curl -i http://localhost:4000/callcount
HTTP/1.1 200
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Mon, 22 Aug 2016 17:43:40 GMT
1
maven-spotify插件用於從以下Dockerfile
創建圖像。
FROM java:8
EXPOSE 4000
VOLUME /tmp
ADD service*.jar app.jar
# http://stackoverflow.com/a/33882286/1309035
# Without this, Java uses /dev/random to seed its SecureRandom class, which can cause Java code to block unexpectedly.
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom","-jar","app.jar"]
我正在使用最新的Docker和Docker-Compose版本(將它們下載到2016年8月22日)。
已解決!見下面的更新部分。在最終答案找到時將會最終確定問題。 - 問題:爲什麼callcount
無法從Docker容器外部訪問?
進一步嘗試:
@CrossOrigin(origins = "*", maxAge = 3600)
- 相同的結果- 全球CORS從the spring docs配置。
- 將兩種方法合併到AliveController中。
- 刪除每個容器和圖像和碼頭從頭開始重新構建。
Udates:
的callcount
API不是由Spring註冊。我添加了另一個test
API來驗證這也是無法通過curl訪問的。 alive
仍然正常工作,並顯示在日誌中。
bash-3.2$ docker logs asmstack_service_1 | grep callcount
bash-3.2$ docker logs asmstack_service_1 | grep test
bash-3.2$ docker logs asmstack_service_1 | grep alive
2016-08-23 08:42:06.530 INFO 1 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/alive],methods=[GET]}" onto public org.springframework.http.ResponseEntity<?> de.bahr.asmstack.AliveController.alive()
我使用JDK 1.8本地(java.vm.vendor = Oracle公司)。啓動方法
的callcount
之間
$ java -version
java version "1.8.0_74"
Java(TM) SE Runtime Environment (build 1.8.0_74-b02)
Java HotSpot(TM) 64-Bit Server VM (build 25.74-b02, mixed mode)
差異運行的應用程序的IntelliJ出來,並與mvn spring-boot:run
時,正確註冊。如果與
java -Djava.security.egd=file:/dev/./urandom -jar my-service.jar
或
java -jar my-service.jar
來看,它並沒有得到註冊。這應該是它無法從Docker容器內訪問的原因。
任何想法爲什麼這種情況?它的工作一樣,在另一個項目從2015年起晚
當Spring啓動時,日誌將包含所有正在顯示的請求映射。在Docker中運行時,你看到'/ callcount'的映射嗎? –
我確實假設你的應用程序工作正常。該問題很可能是正在創建的圖像。我建議你運行一個全新的'mvn clean package'來創建一個新的映像,並檢查'docker images'是否真的是新創建的。總的來說,我並沒有對spotify maven插件做出很好的體驗,所以通常只需放入一個Dockerfile並在mvn運行後調用docker build。 –
@ daniel.eichten我從頭開始刪除了每個圖像和容器並重建了docker。問題依然存在。 – michaelbahr