1

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); 
    } 
} 

callcountalive 있습니다.

@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

으로 실행하는 경우는 등록되지 않습니다. 이것이 Docker 컨테이너에서 액세스 할 수없는 이유입니다.

왜 그런지 알고 싶습니다. 그것은 내가 @ daniel.eichten 및 @ShawnClark의 도움으로 문제를 해결할 수 있었다

+0

봄이 시작될 때 로그에는 노출되는 모든 요청 매핑이 포함됩니다. Docker에서'/ callcount'를 실행할 때 매핑을 볼 수 있습니까? –

+0

귀하의 앱이 정상적으로 작동한다고 가정합니다. 이 문제는 이미지 생성 가능성이 가장 높습니다. 새로운 이미지를 만들고'docker images'가 정말 새로 생성되었는지 확인하기 위해 신선한'mvn clean 패키지 '를 실행 해보길 권합니다. 일반적으로 나는 spotify Maven 플러그인에 대한 좋은 경험을하지 못했기 때문에 일반적으로 Dockerfile을 넣고 mvn을 실행 한 후에 docker 빌드를 호출합니다. –

+0

@ daniel.eichten 모든 이미지와 컨테이너를 삭제하고 처음부터 도커를 다시 작성했습니다. 문제가 지속됩니다. – michaelbahr

답변

0

말 2015에서 다른 프로젝트에 그런 일을하지만,이 실패하는 이유 내가/작품을 을 이해하지 않습니다. T

이것은 Docker 문제가 아니지만 Spring과 관련이 있습니다.

here (질문은 관련이있을 수 있습니다)가, 내가

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

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

예상대로 이제 모든 API에 액세스, 또한 부두 노동자 내부에서 실행에

@SpringBootApplication 
public class Application { 

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

에서 봄 - 응용 프로그램을 변경 바와 같이 컨테이너.

관련 문제