Rails 애플리케이션을 위한 개발 컨테이너 설정

Setting Up Rails with Dev Containers

작성자
발행일
2025년 08월 14일

핵심 요약

  • 1 개발 컨테이너는 재현 가능한 개발 환경을 제공하여 팀 내 애플리케이션 설정 및 코드 공유를 용이하게 합니다.
  • 2 이는 본질적으로 Docker 컨테이너이며, .devcontainer 폴더와 devcontainer.json 파일과 같은 컨벤션을 통해 에디터 및 IDE 통합을 강화합니다.
  • 3 이 글은 기존 Rails 애플리케이션에 Dockerfile, docker-compose.yml, entrypoint 스크립트를 활용하여 개발 컨테이너를 설정하는 실용적인 방법을 제시합니다.

도입

재현 가능한 개발 환경은 팀 내 애플리케이션 설정의 용이성과 코드 공유를 보장하는 가장 효과적인 방법 중 하나이며, 개발 컨테이너는 이러한 목표를 달성하기 위한 핵심 도구입니다. 본 문서는 개발 컨테이너의 근본적인 개념을 소개하고, 기존 Rails 애플리케이션에 개발 컨테이너를 설정하는 최소한의 예시를 제공하는 데 중점을 둡니다. 특히, Rails 8+ 버전에서 새로 생성되는 애플리케이션에 대한 기본 설정보다는, 이미 상당 기간 운영되어 온 기존 Rails 애플리케이션을 적절히 컨테이너화하는 문제 해결에 초점을 맞춥니다. 이는 개발 환경의 일관성을 확보하고 온보딩 프로세스를 간소화하는 데 기여할 것입니다.

개발 컨테이너는 종종 VS Code의 특정 기능으로 오해되기도 하지만, 본질적으로는 일반적인 Docker 컨테이너입니다. Dockerfile 또는 docker-compose.yml을 기반으로 하며, 이미 도커화된 애플리케이션의 개발용 이미지 또한 개발 컨테이너로 간주될 수 있습니다. 개발 컨테이너의 진정한 가치는 특정 컨벤션을 따름으로써 에디터 및 IDE와의 통합이 용이해지고, 결과적으로 컨테이너 사용이 매우 편리해지는 지점에서 발휘됩니다. 첫 번째 주요 컨벤션은 .devcontainer 폴더의 사용입니다. 이 폴더는 Dockerfile 및 docker-compose.yml과 같은 컨테이너 관련 구성 파일을 저장하는 표준 위치로, 에디터 확장이 설정을 쉽게 인식하도록 돕습니다. 두 번째는 devcontainer.json 파일입니다. 이 JSON 파일은 애플리케이션의 컨테이너 환경 설정을 기술하며, 컨테이너 이름, Dockerfile 경로, 빌드 컨텍스트, 그리고 postCreateCommand와 같은 명령을 정의할 수 있습니다. 이 파일은 VS Code와 같은 개발 환경에서 컨테이너를 자동으로 빌드하고 실행하는 데 필수적인 역할을 합니다.

Rails 애플리케이션에 개발 컨테이너를 설정하는 과정은 매우 직관적입니다. 앞서 언급했듯이, .devcontainer 폴더를 생성하고 그 안에 Dockerfile, docker-compose.yml, 그리고 entrypoint.sh 파일을 배치합니다. Rails 애플리케이션은 대부분 데이터베이스를 필요로 하므로, 애플리케이션과 데이터베이스 서비스를 함께 관리하기 위해 docker-compose.yml 파일이 필수적입니다. 또한, gem 번들 설치 및 데이터베이스 설정(생성, 마이그레이션)을 자동화하기 위한 entrypoint.sh 스크립트도 포함됩니다.

  • Dockerfile: Ruby 3.3.0 이미지를 기반으로 Node.js, Yarn, build-essential, PostgreSQL 클라이언트 라이브러리(libpq-dev), netcat-traditional 등 필수 패키지를 설치합니다. 이후 Rails와 Bundler를 설치하고, 작업 디렉토리를 /app_name으로 설정합니다. 마지막으로 entrypoint.sh 스크립트를 컨테이너 내부에 복사하고 실행 권한을 부여하여 컨테이너 시작 시 자동으로 실행되도록 합니다.
  • entrypoint.sh: 이 셸 스크립트는 컨테이너가 시작될 때 bundle install을 실행하고, PostgreSQL 데이터베이스가 준비될 때까지 대기합니다. 데이터베이스 연결이 확인되면 bundle exec rails db:createbundle exec rails db:migrate 명령을 통해 데이터베이스를 설정한 후 대화형 셸을 시작합니다.
  • docker-compose.yml: web 서비스(Rails 애플리케이션)와 db 서비스(PostgreSQL 데이터베이스)를 정의합니다. web 서비스는 현재 프로젝트 루트 디렉토리를 /app_name으로 마운트하고, gem 캐싱을 위한 bundle_cache 볼륨을 사용합니다. 포트 3000을 호스트와 연결하고, db 서비스에 의존성을 가집니다. db 서비스는 postgres:13 이미지를 사용하며, PostgreSQL 사용자, 비밀번호, 데이터베이스 이름을 환경 변수로 설정하고, pgdata 볼륨을 통해 데이터 지속성을 확보합니다.
  • devcontainer.json: 이 파일은 Rails 개발 컨테이너의 설정을 정의합니다. dockerComposeFiledocker-compose.yml로 지정하고, 주 서비스로 web을 설정하며, 작업 공간을 /app_name으로 지정합니다. customizations 섹션에서는 VS Code 확장을 추가할 수 있으며, postCreateCommand를 통해 컨테이너 생성 후 bundle install && rails db:create && rails db:migrate와 같은 초기 설정을 자동화할 수 있습니다.

이러한 설정이 완료되면, docker compose -f .devcontainer/docker-compose.yml build 명령으로 컨테이너를 빌드하고, docker compose -f .devcontainer/docker-compose.yml run --rm --service-ports web 명령으로 실행할 수 있습니다. VS Code에서 프로젝트 폴더를 열고 Dev Containers 확장이 설치되어 있다면, 에디터가 자동으로 컨테이너 환경을 인식하고 개발을 시작할 수 있도록 지원합니다. 애플리케이션은 localhost:3000으로 접근 가능하며, 테스트 실행은 docker compose -f .devcontainer/docker-compose.yml run --rm --service-ports web bundle exec rspec과 같은 명령을 통해 컨테이너 내에서 수행할 수 있습니다.

결론

개발 컨테이너를 수동으로 실행하는 것도 가능하지만, VS Code와 같은 통합 개발 환경이 제공하는 매끄러운 통합 기능을 활용하는 것이 개발 경험을 훨씬 향상시킬 수 있습니다. 특히 VS Code는 `devcontainer.json` 파일을 적극적으로 활용하여 `entrypoint.sh`에서 수행하는 일부 초기 설정 작업을 자동화할 수 있습니다. 하지만 이 방식의 가장 큰 장점은 모든 팀원이 Docker만 설치되어 있다면 어떤 에디터를 사용하든 동일한 개발 환경을 구축할 수 있다는 유연성에 있습니다. 또한, `dip`와 같은 도구를 활용하면 복잡한 Docker Compose 명령을 단순화하여 개발 워크플로우를 더욱 효율적으로 만들 수 있습니다. FastRuby.io는 애플리케이션의 개발 효율성 향상, 실행 속도 개선, 유지보수 용이성 증대에 특화된 서비스를 제공하고 있으며, 유지보수가 필요한 애플리케이션에 대한 상담을 환영합니다. 이로써 개발 컨테이너가 Rails 프로젝트의 생산성과 협업을 어떻게 개선할 수 있는지 명확히 보여줍니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!