Docker Volumes: 파일 마운트 문제 해결 과정

정혜인·2024년 11월 30일

클라우드

목록 보기
11/15

프로젝트를 Docker Compose로 구성하며 "파일 마운트 문제"를 경험했습니다…..

frontendbackend 서비스에서 파일을 컨테이너로 마운트하려 했지만, 디렉토리가 생성되지 않거나 의존성 충돌 문제가 발생했던 것인데요………..

이번 포스팅에서는 이 문제를 해결하는 과정과 결론적으로 어떻게 해결했는지를 기록해두려고 합니다.

🚀 수정 전 기존 코드

먼저, 아래의 Docker Compose 설정으로 기존에 배포되어 있었습니다.
그런데 프론트엔드에서 빌드된 폴더를 가져오지 못한다는 것을 알게 되었고, 여러 테스트를 거치며 프론트엔드 폴더 자체에 접근하지 못한다는 것을 알게 되었습니다.

그래서 찾아보니, 지금 저처럼 모노레포로 관리하는 경우에 볼륨 설정에 대한 이야기가 꽤 있다는 것을 알게 되었습니다. 그래서 도커의 볼륨에 대해 조금 공부해보게 되었고, 아래의 제 코드에 문제가 있다는 것을 알게 되었습니다.

기존 설정에서는 각 서비스가 개별적으로 정의되어 있었고, volumes 설정이 없어서 frontend 컨테이너에서 app 디렉토리가 제대로 생성되지 않았습니다.

version: '3'
services:
  backend:
    build:
      context: .
      dockerfile: backend/Dockerfile
    environment:
      - NODE_ENV=production
    networks:
      - app-network

  frontend:
    build:
      context: .
      dockerfile: frontend/Dockerfile
    networks:
      - app-network

  nginx:
    image: nginx:alpine
    volumes:
      - /etc/letsencrypt:/etc/letsencrypt
      - ./nginx.conf:/etc/nginx/nginx.conf
    ports:
      - "80:80"
      - "443:443"
    depends_on:
      - backend
      - frontend
    networks:
      - app-network

networks:
  app-network:
    driver: bridge

frontend 컨테이너에서 애플리케이션 파일을 /app 디렉토리로 마운트하려고 했지만,

실제로는 app 디렉토리가 컨테이너 내에 생성되지 않았습니다.

이로 인해 frontend에서 필요한 파일들이 제대로 마운트되지 않거나 파일 경로 문제가 발생했습니다.

🔄 첫 번째 시도 : 현재 디렉토리 마운트

이 문제를 해결하기 위해 frontendbackend 서비스 모두에서 volumes 설정을 추가하여 현재 디렉토리(.)를 /app 디렉토리로 마운트하도록 했습니다.

version: '3'
services:
  backend:
    build:
      context: .
      dockerfile: backend/Dockerfile
    environment:
      - NODE_ENV=production
    networks:
      - app-network
    volumes:
      - .:/app

  frontend:
    build:
      context: .
      dockerfile: frontend/Dockerfile
    networks:
      - app-network
    volumes:
      - .:/app

  nginx:
    image: nginx:alpine
    volumes:
      - /etc/letsencrypt:/etc/letsencrypt
      - ./nginx.conf:/etc/nginx/nginx.conf
    ports:
      - "80:80"
      - "443:443"
    depends_on:
      - backend
      - frontend
    networks:
      - app-network

networks:
  app-network:
    driver: bridge

volumes 항목을 추가하여 현재 로컬 디렉토리를 /app 디렉토리로 마운트했습니다. 이를 통해 frontendbackend 컨테이너에서 동일한 파일을 공유할 수 있게 되었습니다.

하지만…. 이 변경으로 backend 서비스에서 express 패키지를 찾지 못하는 문제가 발생했습니다.

찾아보니 이는 node_modules 폴더가 로컬 환경에서 이미 존재하고, Docker 컨테이너에서 제대로 설치되지 않은 상태에서 발생할 수 있는 문제라고 합니다.

결론적으로 node_modules를 공유하게 되면서 패키지가 누락된 것이었습니다.

🛠️ 최종 수정: node_modules 제외 설정

컨테이너 환경마다 독립적인 의존성 관리를 위해 각 서비스별 node_modules를 제외한 디렉토리로 설정을 수정해주었습니다.

이렇게 설정을 해주니 각 컨테이너는 자체적인 node_modules 디렉토리를 갖게 되어 의존성 충돌을 방지하게 되었습니다.

version: '3'
services:
  backend:
    build:
      context: .
      dockerfile: backend/Dockerfile
    environment:
      - NODE_ENV=production
    networks:
      - app-network
    volumes:
      - .:/app
      - /app/node_modules
      - /app/backend/node_modules

  frontend:
    build:
      context: .
      dockerfile: frontend/Dockerfile
    networks:
      - app-network
    volumes:
      - .:/app
      - /app/node_modules
      - /app/frontend/node_modules
    depends_on:
      - backend

  nginx:
    image: nginx:alpine
    volumes:
      - /etc/letsencrypt:/etc/letsencrypt
      - ./nginx.conf:/etc/nginx/nginx.conf
    ports:
      - "80:80"
      - "443:443"
    depends_on:
      - backend
      - frontend
    networks:
      - app-network

networks:
  app-network:
    driver: bridge

먼저 frontendbackend 컨테이너에 node_modules를 명시적으로 지정하여, 각 컨테이너에서 로컬의 node_modules와 충돌하지 않도록 했습니다.

그리고 /app/node_modules와 각 서비스별로 /app/frontend/node_modules, /app/backend/node_modules를 따로 설정하여, 각 서비스에서 의존성을 독립적으로 관리할 수 있도록 했습니다.

이렇게 변경하니 express 패키지를 포함한 모든 의존성 패키지들이 컨테이너 내에서 올바르게 설치되고, 정상적으로 실행되었습니다…..ㅠㅠㅠ

🎃 왜 이렇게…?

처음에는 로컬 파일을 컨테이너에 마운트하는 방식으로 간단하게 해결하려 했지만, node_modules와 같은 패키지 디렉토리가 마운트되면 의존성 관리에 문제가 생기기 쉽다고 합니다…..

특히, 로컬 환경과 Docker 환경의 차이로 인해 패키지가 누락되거나 충돌하는 문제가 발생할 수 있다는 것을 알게 되었는데요…….

그래서 각 컨테이너 내에서 독립적으로 node_modules를 관리할 수 있도록 설정을 변경해주었고,

이렇게 변경하니 각 서비스의 의존성을 개별적으로 설치하고, 로컬 환경과 Docker 환경 간의 충돌을 피할 수 있었습니다.


사실 Docker compose에서 이야기하는 voulmes에 대해서 잘 알지 못했습니다. 어떤 개념인 건지 이해하기 어려웠고, 제가 여태껏 했던 프로젝트 배포에서는 볼륨까지 사용할 일이 없었기 때문이겠죠……..

그런데 이번에는 모노레포로 하나의 서버에서 띄우다 보니 volumes에 대해서도 알게 되었고,

Docker Compose에서의 volumes 설정은 매우 중요하다는 것도….. 알게 되었습니다…..

이번 프로젝트를 진행하면서 docker나 docker-compose, nginx에 대해서 많이 포스팅하고 있는 것 같은데, 정말 개인적으로 클라우드에 대해 많이 공부하게 된 것 같습니다.

0개의 댓글