본문 바로가기
1% 이해하기 시리즈/Golang

[golang 1% 이해하기] air | 실시간 코드 변경을 위한 live-reload 기능 도입하기 #2 docker 컨테이너와 로컬 레포 연동하기

by TLOWAC 2024. 10. 30.

 

 

🏃🏻 들어가며

이번 글에서는 이전 글의 연장선으로 air 를 사용하여 docker container 와 로컬 레포를 연동하여 사용하는 방법에 대해서 알아보겠습니다.

 

 

일반적으로는 

1. Dockerfile 작성 /

2. docker container stop ( 구동중인 docker container 정지 ) /

3. docker build ( 새로운 docker 이미지 빌드 ) /

4. docker container start ( 새로운 이미지 기반의 docker container 실행 )

등의 과정을 거치게 됩니다.

코드의 변경 과정이 생긴다면 2 ~ 4 과정을 반복해야하는 불편함이 있습니다.

 

하지만, docker 이미지 빌드 과정에서 docker container 와 로컬 레포를 연동하고, 코드의 변경 사항이 발생 할 때마다 air 가 docker container 내부에서 동작 중인 go 서버를 재시작 함으로써 이러한 불편함을 해결 할 수 있습니다.

 

 

정리하자면, 최종적으로는 2가지 효용성을 얻을 수 있습니다. 

첫번째로는 air 를 사용하여 코드 변경에 따른 서버 재시작 기능 입니다.

두번째로는 추가적인 docker conatiner 빌드 과정 없이 사용 할 수 있다는점 입니다.

 


 

 local 환경에서의 air 설치 및 구성

1) Dockerfile 작성하기

전체적인 내용은 go 기반의 프로젝트를 이미지로 빌드하는 일반적인 방법 이지만, 2가지 부분이 변경 됩니다.

첫번째로 docker container 에 air 를 설치 합니다.

 RUN go install github.com/air-verse/air@latest 

 

두번째로 docker container 실행시의 명령어를 go run 을 대신해 air 명령어로 변경 합니다.

 CMD ["air", "-c", ".air.toml"]

# 빌드 스테이지
FROM golang:1.23-alpine AS builder

WORKDIR /app

# air live-reload 설치
RUN go install github.com/air-verse/air@latest

# 의존성 파일 복사 및 다운로드
COPY go.mod ./
RUN go mod download

# 소스 코드 복사
COPY . .

# 접근 가능 포트 설정
EXPOSE 8080

# air live-reload 실행
CMD ["air", "-c", ".air.toml"]

 

 

2) Docker 명령어 수정

-p 8080:8080                  | docker container 포트를 맵핑 합니다. 로컬의 8080 / docker 컨테이너의 8080

--rm                                   | docker container 가 종료되면 자동으로 삭제 합니다.

- v $(pwd):/app             | 현재의 로컬 레포를 docker container 의 /app 폴더에 연결 합니다. 

go-docker-container  | 실행할 docker container 이름. ( 빌드시에 별도로 작성해줘야 합니다.

docker run -p 8080:8080 --rm -v $(pwd):/app go-docker-container

 


 

 

📍마무리하며

이번 글을 통해서 반복적인 docker 와의 중지 / 삭제 / 빌드 / 실행의 무한 루프에서 벗어나시는데 도움이 되었으면 좋겠습니다 :)

댓글