상황
도커컴포즈를 사용해서 부트와 mysql을 띄우려고 하니 connection refuse에러가 발생했다.
당시의 코드
docker-compose.yml
version: "3.7"
services:
db:
image: mysql:5.7
environment:
MYSQL_USER: master
MYSQL_DATABASE: chuanione
MYSQL_PASSWORD: rnlaufdmlzkfskf!
MYSQL_ROOT_PASSWORD: emforhsqhftbvj
TZ: Asia/Seoul
volumes:
- "./db_data:/var/lib/mysql"
ports:
- "3305:3306"
container_name: mysql_chu
networks:
- backend-network
spring-boot:
build:
context: ./backend/chuanione
dockerfile: Dockerfile
image: boot_chu
ports:
- "8080:8080"
container_name: boot_chu
restart: always
depends_on:
- db
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://mysql_chu:3305/chuanione?useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Seoul
SPRING_DATASOURCE_USERNAME: master
SPRING_DATASOURCE_PASSWORD: 1234
networks:
- backend-network
- frontend-network
networks:
backend-network:
frontend-network:
Dockerfile ->스프링 프로젝트 루트에 위치
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE=build/libs/chuanione-0.0.1-SNAPSHOT.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
application.properties
#h2 setup
#spring.h2.console.enabled=true
spring.jpa.defer-datasource-initialization=true
#spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
#spring.jpa.hibernate.ddl-auto=update
#url fix
#spring.datasource.url=jdbc:h2:mem:testdb
#show pretty
spring.jpa.properties.hibernate.format_sql=true
#print debug level
logging.level.org.hibernate.SQL=DEBUG
spring.datasource.url=jdbc:mysql://{url}:3305/chuanione?useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Seoul
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=master
spring.datasource.password=1234
# mysql ??
spring.jpa.database=mysql
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
#spring.jpa.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
개념 설명
도커 컴포즈를 사용해서 한번에 통합으로 실행한다. 우선 mysql을 수행한 뒤 스프링 부트를 수행하는데 부트의 경우 도커컴포즈로 다 처리할 수 없는 추가 명령어들이 몇 개 필요하다. -> 대부분의 백엔드 프로그램은 별도의 도커 파일이 필요함
그래서 도커파일을 추가로 생성하고 도커 파일 위치만 지정했다.
발생했던 문제
H2를 사용하다 mysql로 옮겼을 때 부터
Error creating bean with name 'entityManagerFactory'
에러가 발생했다.
MySQL5InnoDBialect가 빠져서 발생하는 문제라고 해서 추가했지만 계속 에러가 발생하다가 다음날부터 Connection Refuse에러가 발생해서 해결에 오랜 시간 걸렸다.
시도한 방법
우선 H2에서 mysql로 옮길 때 발생한 에러는 연결은 됐는데 mysql설정을 못 읽어서 발생한 에러였다. 접속을 했는데 sql과 연동에서 발생한 에러였고 이것저것 만지다 보니 연결 자체가 안 되는 에러로 바뀌었다.
우선 application.properties에 서버 url을 원래는 서버주소:3305로 해뒀는데 도커컴포즈에서 생성한 컨테이너 이름으로 변경했다. -> mysql_chu:3305 이런 식으로
그래도 마찬가지로 에러가 발생했고 원인을 찾을 수 있었다.
도커컴포즈 파일에서 sql 환경을 설정하는 부분을 제거하니 수행됐다.
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://mysql_chu:3305/chuanione?useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Seoul
SPRING_DATASOURCE_USERNAME: master
SPRING_DATASOURCE_PASSWORD: 1234
properties랑 environment 둘 다 등록하면 발생하는 에러인가 싶어서 properties의 설정을 끄고 environment설정면 켜 두고 했는데 마찬가지로 연결이 안 돼서 environment대신에 properties만 사용했다.
정리하자면 도커컴포즈의 environment를 삭제하고
application.properties의 url을 mysql컨테이너 이름으로 변경한 뒤 실행하니까 해결됐다.
'IT > 프로젝트 개발 중 발생한 에러' 카테고리의 다른 글
도커컴포즈 + 스프링부트 + nginx + mysql connection refused (0) | 2022.09.26 |
---|---|
도커컴포즈 + 스프링부트 + nginx + react 404 에러 (0) | 2022.09.26 |
스프링시큐리티 + JWT 로그인 시 토큰 유효성검사 에러 (0) | 2022.09.19 |
스프링시큐리티 401에러와 body가 빈 상태코드 200리턴 (0) | 2022.09.16 |
AWS EC2 서버 이전시 발생한 이슈들 -SQLGrammarException: could not extract Result Set (0) | 2022.09.07 |