Go 앱 Docker화
850mb
에서 15mb
로 줄이기 위해 빌더 패턴과 다단계 빌드를 활용하여 Go 앱을 도킹할 것입니다!이 기사는 Dockerize 시리즈의 일부입니다. 우리가 사용할 몇 가지 개념을 어디에서 살펴볼 것인지 확인하십시오. 이 기사의 코드를 사용할 수 있습니다here.
영상도 준비했으니 따라해보시면 좋을 것 같아요
프로젝트 설정
Mux을 사용하여 간단한 API를 초기화했습니다.
├── main.go
├── go.mod
└── go.sum
여기 우리
main.go
package main
import (
"encoding/json"
"log"
"net/http"
"github.com/gorilla/mux"
)
func main() {
router := mux.NewRouter()
router.HandleFunc("/", func(rw http.ResponseWriter, r *http.Request) {
response := map[string]string{
"message": "Hello Docker!",
}
json.NewEncoder(rw).Encode(response)
})
log.Println("Server is running!")
http.ListenAndServe(":4000", router)
}
개발용
우리는 개발 워크플로의 일부로 Reflex을 사용할 것입니다. 익숙하지 않은 경우 Refelx는 개발 시 실시간 다시 로드를 제공합니다.
Dockerfile
를 추가하여 도커 설정을 계속합시다.FROM golang:1.16.5 as development
# Add a work directory
WORKDIR /app
# Cache and install dependencies
COPY go.mod go.sum ./
RUN go mod download
# Copy app files
COPY . .
# Install Reflex for development
RUN go install github.com/cespare/reflex@latest
# Expose port
EXPOSE 4000
# Start app
CMD reflex -g '*.go' go run api.go --start-service
docker-compose.yml
를 만들어 봅시다. 여기에서는 개발하는 동안 변경 사항을 컨테이너와 동기화할 수 있도록 코드를 volume에 마운트합니다.version: "3.8"
services:
app:
container_name: app-dev
image: app-dev
build:
context: .
target: development
volumes:
- .:/app
ports:
- 4000:4000
시작! 시작! 시작!
docker-compose up
-d
플래그를 사용하여 데몬 모드에서 실행할 수도 있습니다.좋습니다. 개발 서버가 가동되었습니다!
app-dev | Starting service...
app-dev | 2021/07/04 12:50:06 Server is running!
docker images
명령을 사용하여 이미지를 확인합시다.REPOSITORY TAG IMAGE ID CREATED SIZE
app-dev latest 3063740d56d8 7 minutes ago 872MB
안녕하세요 세계를 위해
850mb
이상! 이것은 개발용으로 괜찮을 수 있지만 프로덕션용으로 이미지 크기를 줄이는 방법을 살펴보겠습니다.생산용
Dockerfile
및 builder
단계를 추가하여 production
를 업데이트합시다.업데이트:
CGO_ENABLED 0
명령 바로 앞에 수행하는 대신 ENV
에서 Dockerfile
를 사용하여 go build
를 정의하는 방법에 주목하십시오. 또한 alpine
를 사용하여 프로덕션 환경에서 컨테이너를 디버그하기가 정말 어렵기 때문에 scratch
대신 scratch
를 사용할 것입니다.FROM golang:1.16.5 as builder
# Define build env
ENV GOOS linux
ENV CGO_ENABLED 0
# Add a work directory
WORKDIR /app
# Cache and install dependencies
COPY go.mod go.sum ./
RUN go mod download
# Copy app files
COPY . .
# Build app
RUN go build -o app
FROM alpine:3.14 as production
# Add certificates
RUN apk add --no-cache ca-certificates
# Copy built binary from builder
COPY --from=builder app .
# Expose port
EXPOSE 4000
# Exec built binary
CMD ./app
프로덕션 이미지 빌드를 추가해 보겠습니다.
docker build -t app-prod . --target production
빌드된 프로덕션 이미지를 확인해 보겠습니다.
docker images
빌더 패턴을 사용하여 이미지 크기를
~15mb
로 줄였습니다!!REPOSITORY TAG IMAGE ID CREATED SIZE
app-prod latest ed84a3896251 50 seconds ago 14.7MB
포트
80
에서 생산 컨테이너를 시작하겠습니다.docker run -p 80:4000 --name app-prod app-prod
워크플로를 더 쉽게 만들기 위해
Makefile
을 추가할 수도 있습니다.dev:
docker-compose up
build:
docker build -t app-prod . --target production
start:
docker run -p 80:4000 --name app-prod app-prod
다음 단계
이를 통해 워크플로에서 docker를 활용하고 선택한 플랫폼에 프로덕션 이미지를 더 빠르게 배포할 수 있어야 합니다.
문제가 발생하면 언제든지 문의해 주세요.
Reference
이 문제에 관하여(Go 앱 Docker화), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/karanpratapsingh/dockerize-your-go-app-46pp텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)