Docker + Docker compose


postgresql, redis 등 각각의 설치및 구성요소들을 개발환경, 실서버 환경에 반복해서 세팅해주긴 싫었기 떄문에 backend는 컨테이너화로 배포 및 개발환경 구성을 하기로 했습니다.

Golang

파일변경을 확인하고 자동으로 재실행해주는 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에서 어떤 보편적인 방법이 있나 봤습니다.

  1. godotenv를 이용해서 .env 파일을 불러와서 환경변수에 저장한다음 os.getEnv() 사용
  2. 환경변수를 설정해준다음 os.getEnv() 사용

결국 보편적인 두 방법 모두 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