[Docker] springboot 프로젝트를 올리면서 만난 에러들

Coastby·2022년 11월 2일
0

문제 해결

목록 보기
3/17

🚫 Optional 관련 에러


Hospital hospital = hospitalDao.findById(id);
Optional<Hospital> opt = Optional.of(hospital);

if (opt.isEmpty()) {
    return "찾는 아이디가 없습니다.";
}
log.info("ID:"+id+"가 조회되었습니다.");
String status = statusCode.get(hospital.getBusinessStatusCode());
return String.format("1. 병원 이름 : %s,\n2. 주소 : %s,\n3. 도로명 주소 : %s,\n4. 의료진 수 : %d,\n" +
                "5. 병상 수 : %d,\n6. 면적 : %f,\n7. 폐업여부 : %s",
        hospital.getHospitalName(), hospital.getFullAddress(), hospital.getRoadNameAddress(), hospital.getHealthcareProviderCount(),
        hospital.getTotalNumberOfBeds(), hospital.getTotalAreaSize(), status);


⭕️ 해결

of 대신 ofNullable로 변경

Optional<Hospital> opt = Optional.ofNullable(hospital);



🚫 maven 빌드 시 에러


mvn package
[ERROR] Errors:
[ERROR]   HospitalApiApplicationTests.contextLoads » IllegalState Failed to load Applica...
[ERROR]   ReadLineContextTest.readFile » IllegalState Failed to load ApplicationContext
[ERROR]   ReadLineContextTest.readFileAndSave » IllegalState Failed to load ApplicationC...
[INFO]
[ERROR] Tests run: 4, Failures: 0, Errors: 3, Skipped: 0

로컬에서는 테스트에 통과하는데 서버에서는 안되는 경우가 있음

⭕️ 해결

일단 test를 스킵하고 메이븐 빌드

mvn -DskipTests=true package

target에 jar 파일이 생겼는 지 확인



🚫 Docker run 관련 에러


❌ 그냥 docker run ~ 을 하면 도커에서 포트를 쓸 수 없다.

⭕️ 포트포워딩해서 띄우기

docker run -p 8080:8080 springboot-jdbc-template

🚫 에러 : denied 됨..

❌ 관리자 권한으로 접근해야 한다고 한다.

docker login 

하지만, 이것도 방법이 아니었다.

docker run을 실행했을 때 local에 해당 image가 없으면 Hub에서 찾으려고 한다. 그래서 로그인을 하라고 하는 것인데, 보통 이미지 이름을 잘못 입력한 경우인 듯

그래서 이름을 확인하고 images에 있는 이름을 또박또박 입력해보자.



🚫 Docker로 스프링 실행 시 에러


Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2022-11-02 06:37:04.874 ERROR 1 --- [           main] o.s.b.d.LoggingFailureAnalysisReporter   :

***************************
APPLICATION FAILED TO START
***************************

Description:

Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.

Reason: Failed to determine a suitable driver class

⭕️ 데이터 베이스를 넘기기 위해 환경변수를 설정해야 한다.

docker run -p 8080:8080 springboot-jdbc-template -e SPRING_DATASOURCE_URL=jdbc:mysql://[EC2도메인주소]:3306/likelion

아…나는 application.yml을 안 올렸다.

1) 환경변수로 다 올린다…
2) 그냥 다시 올린다… <<<<< 선택

  1. 소스코드 + 추가된 파일 git push
  2. 서버의 리포지토리에 git pull
  3. mvn package
  4. docker build ~
  5. docker run



🚫 image 삭제하기


같은 에러가 계속 나고 비슷한 이미지가 2개가 되었다.
그래서 이미지를 삭제해보기로 했다.

⭕️ image 삭제하기

docker rmi [이미지이름]


사용되고 있어서 지워지지 않는다고 한다.
명령어로 내려간 container 까지 확인해서 다 지워준다.

root@ip-172-31-20-22:~/springboot-hospital-api# docker container ls -a
CONTAINER ID   IMAGE                  COMMAND                  CREATED         STATUS                     PORTS     NAMES
57d8c9ff16cb   spring-boot-template   "java -Djava.securit…"   5 minutes ago   Exited (1) 5 minutes ago             epic_napier
72b714ab677f   spring-boot-template   "java -Djava.securit…"   2 hours ago     Exited (1) 2 hours ago               nifty_bohr
6767b51cd305   spring-boot-template   "java -Djava.securit…"   2 hours ago     Exited (1) 2 hours ago               festive_chatelet
cffc90d13350   spring-boot-template   "java -Djava.securit…"   2 hours ago     Exited (1) 2 hours ago               silly_faraday
1913f2bdc8f8   spring-boot-template   "java -Djava.securit…"   2 hours ago     Exited (1) 2 hours ago               recursing_ganguly
63039731378c   spring-boot-template   "java -Djava.securit…"   2 hours ago     Exited (1) 2 hours ago               beautiful_chatelet
b3648383cf13   spring-boot-template   "java -Djava.securit…"   2 hours ago     Exited (1) 2 hours ago               brave_bhaskara
root@ip-172-31-20-22:~/springboot-hospital-api# docker container rm 57d8c9ff16cb
57d8c9ff16cb
root@ip-172-31-20-22:~/springboot-hospital-api# docker container rm 72b714ab677f
72b714ab677f
...
#컨테이너 다 내리고 이미지를 지워본다
root@ip-172-31-20-22:~/springboot-hospital-api# docker rmi spring-boot-template
Untagged: spring-boot-template:latest
Deleted: sha256:fc10fbc722dc3adb5350318bf5cbc5642f7383bfaab3363c5b9962994c4952c2
Deleted: sha256:57f6168c97ec1315355648465696a7085d3c6cdc9c5b4d805b58e43d91f60ce6
Deleted: sha256:2621ca10a36ff1b756fcb3e1163a19c92e9ae93a1bea9b697987839473a63b89
root@ip-172-31-20-22:~/springboot-hospital-api# docker images
REPOSITORY                 TAG           IMAGE ID       CREATED        SIZE
springboot-jdbc-template   latest        ba41d2d1ac34   2 hours ago    456MB
openjdk                    11-jdk-slim   8e687a82603f   3 months ago   424MB




스프링은 작동이 되고 LTE를 통해서 swagger로 api도 보였다. 하지만 api를 요청하니 서버 500 에러가 발생하고 아래와 같은 에러가 발생하였다.

2022-11-02 08:57:08.455 ERROR 1 --- [nio-8080-exec-9] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.] with root cause

java.net.ConnectException: Connection refused (Connection refused)

톰캣 구동 시 포트 번호가 일치하지 않아서 발생한 오류라고 한다. 연결하려는 호스트 이름 및 포트를 확인한다.

  1. workbench, 로컬에서 구동을 통해 db server는 온전함을 확인하였다.
  2. 로컬에서의 환경변수와 동일하게 설정을 해주었다.

⭕️ image 이름을 맨 마지막에 넣으니까 되었다!
환경변수로 적은 것이 먹히지도 않았던 것이었다. 앞에 스프링이 뜨지도 않았던 것도 이와 같은 이유일 것 같다.

docker run -p 8080:8080 -e SPRING_DATASOURCE_URL=jdbc:mysql://[ec2도메인주소]:3306/likelion -e SPRING_PROFILES_ACTIVE=aws springboot-jdbc-template
profile
훈이야 화이팅

0개의 댓글