Go를 DockerImage화 해보기

임태빈·2022년 1월 7일
0

go

목록 보기
8/13

안녕하세요.

갈비만두를 좋아하는 개발자 임태빈입니다.

이번 포스팅에서는 Go의 웹프레임워크인 Gin을 Dockerfile에 올려보는 것을 해보려고 합니다.

많은 회사들이 컨테이너를 활용하며 빌드한 파일을 도커에 올리는 경우가 많아

이에 대해 간단하게 정리해보면 좋겠다고 생각했습니다.

그러면 한번 Gin을 Dockerfile에 올려보도록 하겠습니다.

먼저 go mod를 활용하여 go.mod를 생성하고 gin 웹프레임워크를 설치하겠습니다.

#폴더 생성 및 이동
mkdir dockergin
cd dockergin

#go mod 생성
go mod init dockergin

#gin 웹프레임워크 추가
go get github.com/gin-gonic/gin

설치가 완료되었으니 코드를 작성해보겠습니다.

package main

import (
	"github.com/gin-gonic/gin"
	"os"
)

func GetHost(c *gin.Context) {
	hostname, err := os.Hostname()
	if err != nil {
		c.JSON(500, gin.H{
			"message": err.Error(),
		})
	}
	c.JSON(200, gin.H{
		"hostname": hostname,
	})
}

func main() {
	r := gin.Default()
	r.GET("/", GetHost)
	r.Run(":3000")
}

코드를 간단하게 설명드리면 localhost:3000 을 get메소드로 호출하면 컨테이너의 호스트네임을 리턴해줍니다. 추후에 이를 활용해 헬름차트도 만들어볼 예정이라 이런 코드를 짜게 되었습니다.

다음으로 Dockerfile을 만들어보겠습니다.

FROM golang:alpine AS builder

ENV GO111MODULE=on \
    CGO_ENABLED=0 \
    GOOS=linux

WORKDIR /build

COPY go.mod go.sum main.go ./

RUN go mod download

RUN go build -o main .

WORKDIR /dist

RUN cp /build/main .

FROM scratch

COPY --from=builder /dist/main .

ENTRYPOINT ["./main"]

코드에 대해 간단하게 설명드리겠습니다.

golang이미지를 받고 환경 설정으로 Go11Module을 하여 빌드 중에 $GOPATH 대신 모듈에 있는 패키지를 사용할 수 있도록 만들었습니다. build폴더로 이동하여 기존에 만들었던 go관련 파일들을 다 복사하고 라이브러리들을 다운받아 설치합니다. 그런 다음 빌드하여 빌드한 파일을 scratch 이미지를 활용해 새 이미지에 저장하여 실행해줍니다.

여기서 scratch이미지는 docker에서 제공해주는 특별한 이미지입니다. 이 이미지는 아무것도 들어있지 않는 이미지입니다. 이를 활용해 위에서 빌드받은 내용들을 scratch이미지에 넣어줌으로써 이미지의 용량을 줄여줄 수 있습니다.

이제 이미지 빌드 및 실행을 해보도록 하겠습니다.

docker build -t <이미지 이름> .
docker run --rm -p 3000:3000  <이미지 이름>

실행 후, 아래 명령어를 통해 값이 나오는지 확인만 해주면 끝입니다.

curl http://localhost:3000

이런 결과가 나오셨다면 성공이십니다!!

해당 글에 관련하여 잘못된 부분이나 궁금하신 내용이 있으시다면 댓글을 남겨주시면 감사드리겠습니다~

profile
golang과 서버 개발을 하고 있는 개발자입니다.

0개의 댓글