tl; dr 도커 컨테이너 내에서 실행되는 경우 나머지 RestController는 제대로 응답하지 않습니다.외부 도커 컨테이너에서 SpringBoot @RestController에 액세스 할 수 없습니다.
이 서비스는 두 개의 API를
@CrossOrigin(origins = "*", maxAge = 3600)
@RestController
public class AliveController {
@RequestMapping(value = "/alive", method = RequestMethod.GET)
public ResponseEntity<?> alive() {
return new ResponseEntity<>(HttpStatus.OK);
}
}
및 callcount
alive
있습니다.
@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"]
나는 (2016 그들 (22) 8월 다운로드) 최신 도커 및 도커-작성 버전을 사용하고 있습니다.
해결 된! 아래의 업데이트 섹션을 참조하십시오. 최종 답변이 발견되면 질문을 마무리합니다. - 질문 : callcount
은 Docker 컨테이너 외부에서 액세스 할 수없는 이유는 무엇입니까?
또한 시도 :
@CrossOrigin(origins = "*", maxAge = 3600)
- the spring docs에서 같은 결과- 글로벌 CORS 구성.
- 두 메서드를 AliveController에 병합합니다.
- 모든 컨테이너와 이미지 및 도커를 처음부터 다시 삭제했습니다. Udates
은 :
callcount
API는 스프링에 의해 등록되지 않습니다. 나는 또 다른 test
API를 추가하여 컬을 통해 액세스 할 수없는 것을 확인했습니다. 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 = 오라클)를 사용합니다.IntelliJ를 벗어나
mvn spring-boot:run
과 앱을 실행할 때 시작 방법
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)
차이는 적절하게 등록된다.
java -Djava.security.egd=file:/dev/./urandom -jar my-service.jar
또는
java -jar my-service.jar
왜 그런지 알고 싶습니다. 그것은 내가 @ daniel.eichten 및 @ShawnClark의 도움으로 문제를 해결할 수 있었다
봄이 시작될 때 로그에는 노출되는 모든 요청 매핑이 포함됩니다. Docker에서'/ callcount'를 실행할 때 매핑을 볼 수 있습니까? –
귀하의 앱이 정상적으로 작동한다고 가정합니다. 이 문제는 이미지 생성 가능성이 가장 높습니다. 새로운 이미지를 만들고'docker images'가 정말 새로 생성되었는지 확인하기 위해 신선한'mvn clean 패키지 '를 실행 해보길 권합니다. 일반적으로 나는 spotify Maven 플러그인에 대한 좋은 경험을하지 못했기 때문에 일반적으로 Dockerfile을 넣고 mvn을 실행 한 후에 docker 빌드를 호출합니다. –
@ daniel.eichten 모든 이미지와 컨테이너를 삭제하고 처음부터 도커를 다시 작성했습니다. 문제가 지속됩니다. – michaelbahr