postgresql, redis 등 각각의 설치및 구성요소들을 개발환경, 실서버 환경에 반복해서 세팅해주긴 싫었기 떄문에 backend는 컨테이너화로 배포 및 개발환경 구성을 하기로 했습니다.
파일변경을 확인하고 자동으로 재실행해주는 air 라는 라이브러리를 설치해주기 위해서
따로 Dockerfile을 만들어서 사용중입니다.
FROM golang:1.18
RUN curl -sSfL <https://raw.githubusercontent.com/cosmtrek/air/master/install.sh> | sh -s -- -b $(go env GOPATH)/bin
또한 db를 연결해주는 값, oauth secret key 같은 민감한 정보는 아무리 private git repository라도 절대 올리면 안된다고 생각하고 있기 떄문에 env 설정같은경우 golang에서 어떤 보편적인 방법이 있나 봤습니다.
결국 보편적인 두 방법 모두 os getenv를 사용하기 떄문에 직접 godotenv로 삽입해준다기보단, docker-compose의 env_file을 이용하기로 했습니다.
최종적인 개발환경 구성은 다음과 같습니다.
version: '3.8'
services:
backend:
build: ./dockerfile/backend
working_dir: /app
env_file:
- ./config/postgresql.env
- ./config/timezone.env
- ./config/dev.env
environment:
- POSTGRES_HOST=postgres
- POSTGRES_PORT=5432
- REDIS_HOST=redis
- REDIS_PORT=6379
volumes:
- ${backend_repo}:/app
- ${backend_repo}/:/go/pkg/mod
command:
- air
ports:
- ?:4000
depends_on:
- postgres
- redis
postgres:
image: postgres:14.1
restart: always
volumes:
- ./postgres_data:/var/lib/postgresql/data
env_file:
- ./config/postgresql.env
- ./config/timezone.env
environment:
- POSTGRES_INITDB_ARGS=--lc-collate='C' --encoding='utf8'
ports:
- ?:5432
redis:
image: redis:6.2.6
volumes:
- ./redis:/data
- ./config/redis.conf:/usr/local/etc/redis/redis.conf
env_file:
- ./config/timezone.env
ports:
- ?:6379