docker-compose로 로컬 DB 환경 구축하기

Jongma·2021년 12월 28일
2
post-thumbnail

1. Outline

REST API를 개발중에 초기 개발환경 세팅을 Docker Container로 세팅을 했습니다.

그런데 매번 Container를 올려주는게 귀찮게 느껴져서 docker-compose를 적용하게 되어서 적용 과정과 적용 과정에서 생긴 문제점을 공유합니다.


docker-compose를 통해서 세팅하고자 했던 환경은 다음과 같습니다.

  1. PostgreSQL 데이터베이스 실행
  2. 미리 작성해둔 SQL 파일로 자동 스키마 생성

해당 세팅은 Windows 10 환경에서 진행했습니다.


2. PostgreSQL 데이터베이스 실행

먼저 저는 postgres:14 이미지를 사용했습니다. 그리고 .env 파일을 통해서 민감한 데이터베이스 접속 정보는 분리하도록 하였습니다.

만약 저처럼 .env를 사용하신다면 github에 해당 정보가 올라가지 않도록 꼭 .gitignore에 등록하셔야 합니다.

# docker-compose.yml

version: '3'
services:
  database:
    container_name: 'pafer_database'
    image: 'postgres:14'
    ports:
      - "${POSTGRES_PORT}:${POSTGRES_PORT}"
    environment:
      POSTGRES_USER: "${POSTGRES_USER}"
      POSTGRES_PASSWORD: "${POSTGRES_PASSWORD}"
      POSTGRES_DB: "${POSTGRES_DB}"
    env_file:
      - .env

1번 사항은 위와 같이 PostgreSQL 데이터베이스 실행을 구현하였습니다.


3. 스키마 생성 자동화 하기

먼저 아래와 같이 Dockerfile을 생성해줍니다. 파일명에 주의해줍니다.

IDE 상에는 DockerFile과 같이 파일명을 적어도 Docker 아이콘이 나올수도 있는데 적용되지 않기 때문에 꼭 확인 하세요!

# Dockerfile

FROM postgres:14
COPY db/init.sql /docker-entrypoint-initdb.d/
  • FROM: 해당 이미지가 생성될 때 해당 Dockerfile이 실행
  • COPY: 컨테이너 내 /docker-entrypoint-initdb.d/ 디렉토리에 db/init.sql 파일을 복사한다.
  • /docker-entrypoint-initdb.d/ 디렉토리에 .sh 파일이나 .sql을 옮겨둘 경우 해당 스크립트들을 실행한다.
# docker-compose.yml

version: '3'
services:
  database:
    container_name: 'pafer_database'
    build: .
    image: 'postgres:14'
    ports:
      - "${POSTGRES_PORT}:${POSTGRES_PORT}"
    environment:
      POSTGRES_USER: "${POSTGRES_USER}"
      POSTGRES_PASSWORD: "${POSTGRES_PASSWORD}"
      POSTGRES_DB: "${POSTGRES_DB}"
    env_file:
      - .env

docker-compose.yml에는 build: . 항목을 추가했는데 의미는 . 경로에 있는 Dockerfile을 실행한다는 의미입니다.

따라서 해당 docker-compose up -d를 실행하면 postgres:14 이미지를 실행한 이후에 init.sql 파일을 실행해 스키마를 생성한다는 의미입니다.

참고로 -d 옵션은 백그라운드로 실행한다는 의미입니다.
이미지를 종료하고 싶을때는 docker-compose down 명령어로 종료할 수 있습니다.

# docker-compose.yml

version: '3'
services:
  database:
    container_name: 'pafer_database'
    image: 'postgres:14'
    ports:
      - "${POSTGRES_PORT}:${POSTGRES_PORT}"
    volumes:
      - ./db/init.sql:/docker-entrypoint-initdb.d/init.sql
    environment:
      POSTGRES_USER: "${POSTGRES_USER}"
      POSTGRES_PASSWORD: "${POSTGRES_PASSWORD}"
      POSTGRES_DB: "${POSTGRES_DB}"
    env_file:
      - .env

저는 이후에 github actions에도 적용해서 CI/CD를 구축했는데 github actions에는 build 항목이 없어서 위와 같이 volumes를 통해서 해결 했습니다.


4. 추가 트러블 슈팅

처음에는 디렉토리만 마운트 되고 파일이 마운트가 되지 않아 구글링 해본결과 아래와 같은 해결 방법을 발견할 수 있었습니다.

https://stackoverflow.com/questions/62215781/docker-compose-failed-to-build-filesharing-has-been-cancelled-eshoponcontain

위 링크에서는 다음과 같이 해결할 수 있었습니다.

파일 마운트를 하기 위해서는 File Sharing 기능을 활성화 시켜야합니다.
이를 위해서 Windows Docker SettingsUse the WSL2 based enging 옵션을 활성화 해주게 되면 File Sharing 기능이 활성화가 되어 해당 이슈가 해결됩니다.

이 포스팅을 통해서 구현에 어려움을 겪고 계신분들에게 도움이 되었으면 좋겠습니다 :)
추후에는 github actions에 대한 내용도 다뤄볼까 합니다.

0개의 댓글