REST API
를 개발중에 초기 개발환경 세팅을 Docker Container
로 세팅을 했습니다.
그런데 매번 Container를 올려주는게 귀찮게 느껴져서 docker-compose
를 적용하게 되어서 적용 과정과 적용 과정에서 생긴 문제점을 공유합니다.
docker-compose
를 통해서 세팅하고자 했던 환경은 다음과 같습니다.
PostgreSQL
데이터베이스 실행- 미리 작성해둔 SQL 파일로 자동 스키마 생성
해당 세팅은 Windows 10
환경에서 진행했습니다.
먼저 저는 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
데이터베이스 실행을 구현하였습니다.
먼저 아래와 같이 Dockerfile
을 생성해줍니다. 파일명에 주의해줍니다.
IDE 상에는 DockerFile
과 같이 파일명을 적어도 Docker 아이콘이 나올수도 있는데 적용되지 않기 때문에 꼭 확인 하세요!
# Dockerfile
FROM postgres:14
COPY db/init.sql /docker-entrypoint-initdb.d/
Dockerfile
이 실행/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
를 통해서 해결 했습니다.
처음에는 디렉토리만 마운트 되고 파일이 마운트가 되지 않아 구글링 해본결과 아래와 같은 해결 방법을 발견할 수 있었습니다.
위 링크에서는 다음과 같이 해결할 수 있었습니다.
파일 마운트를 하기 위해서는 File Sharing
기능을 활성화 시켜야합니다.
이를 위해서 Windows Docker Settings
에 Use the WSL2 based enging
옵션을 활성화 해주게 되면 File Sharing
기능이 활성화가 되어 해당 이슈가 해결됩니다.
이 포스팅을 통해서 구현에 어려움을 겪고 계신분들에게 도움이 되었으면 좋겠습니다 :)
추후에는 github actions
에 대한 내용도 다뤄볼까 합니다.