2016-08-22 103 views
1

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年起晚

+0

當Spring啓動時,日誌將包含所有正在顯示的請求映射。在Docker中運行時,你看到'/ callcount'的映射嗎? –

+0

我確實假設你的應用程序工作正常。該問題很可能是正在創建的圖像。我建議你運行一個全新的'mvn clean package'來創建一個新的映像,並檢查'​​docker images'是否真的是新創建的。總的來說,我並沒有對spotify maven插件做出很好的體驗,所以通常只需放入一個Dockerfile並在mvn運行後調用docker build。 –

+0

@ daniel.eichten我從頭開始刪除了每個圖像和容器並重建了docker。問題依然存在。 – michaelbahr

回答

0

我能夠從@ daniel.eichten和@ShawnClark解決求助問題,但我不明白爲什麼失敗/作品。 T

這不是Docker問題,而是Spring。

可以看出here(問題可能是不相關的),我改變了Spring的應用程序從

​​

@EnableAutoConfiguration 
@EnableWebMvc 
@Configuration 
@ComponentScan 
public class Application { 

    public static void main(String[] args) { 
     SpringApplication.run(Application.class, args); 
    } 
} 

現在所有的API訪問的預期,也是一個泊塢窗內運行時,容器。

相關問題