IT/프로젝트 개발 중 발생한 에러

도커컴포즈 + 스프링부트 + nginx + react 404 에러

은세고화 2022. 9. 26. 20:12
반응형

상황

로컬에서 테스트를 한 뒤 서버에 푸시를 하고 프론트에서 백으로 요청을 보내면 404에러가 발생했다. 404에러면 url이 잘못된건데 눈씻고 찾아봐도 잘못된 url이 보이지 않았다.

 

시도해본 방법

굉장히 많은 방법을 시도했지만 기억나는 것만 서술하겠다.

package.json에 proxy 추가

  "proxy": "http://{스프링 도커 컨테이너 이름}:8080",

또는 서버 url

 

axios경로에는 서버url 설정

baseURL: "http://{url}/api/v1/",

 

nginx.conf

    location /api {
        proxy_pass http://백엔드도커컨테이너 이름:8080;

그 외에 도커컴포즈파일들을 이리저리 만져보고 network도 추가해봤다.

최종 docker-conpose.yml

services:
  nginx:
    image: nginx
    ports:
      - 80:80
    volumes:
      - ./nginx:/etc/nginx/conf.d
      - ./frontend/build:/usr/share/nginx/html
    depends_on:
      - spring-boot

  react:
    image: node:12-alpine
    command: sh -c "npm ci && npm run build"
    ports:
      - 3000:3000
    working_dir: /app
    volumes:
      - ./frontend:/app
    container_name: react_chu

  db:
    image: mysql:5.7
    environment:
      MYSQL_USER: master
      MYSQL_DATABASE: chu
      MYSQL_PASSWORD: password
      MYSQL_ROOT_PASSWORD: password
      TZ: Asia/Seoul
    volumes:
      - "./db_data:/var/lib/mysql"
    ports:
      - "3305:3306"
    container_name: mysql_chu


  spring-boot:
    build:
      context: ./backend/chuanione
      dockerfile: Dockerfile
    image: boot_chu
    ports:
      - "8080:8080"
    container_name: boot_chu
    restart: always
    depends_on:
      - db

 

해결

문제의 원인은 빌드된 파일이 도커에 등록되지 않아서다.

부트를 도커컴포즈가 빌드할 때 ./gradlew build 커맨드가 없다. 

 

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"]

수동으로 자바파일을 빌드를 해줬다. 빌드했다가 끝난게 아니다.

 

도커컴포즈는 이미지파일에 변동이 없으면 기존에 만들어놨던 이미지를 불러온다. <- 이것 때문에 빌드를 했는데도 변화가 없어서 굉장히 오랜시간 걸렸다.

 

도커컴포즈를 실행할 때 초기화한 뒤 다시 빌드하라는 명령어를 써서 빌드해야한다.

 

docker-compose up --build --force-recreate -d

 

반응형