Docker 빌드 의존성 제거와 다단계 빌드

최병훈·2024년 10월 17일
post-thumbnail

1)개요

  • 다단계 빌드는 FROM 명령을 이용해서 여러 단계의 빌드 과정을 만들고 다른 단계에 AS를 이용해서 이름을 부여해서 사용할 수 있도록 하는 것
  • 다른 단계에서 생성된 결과 중 애플리케이션 구동에 필요한 특정 데이터만 가져올 수 있기 때문에 이미지를 경량화 할 수 있습니다.
  • 다단계 빌드로 작성된 이미지는 모든 빌드 의존성이 하나의 환경에 포함되므로 빌드 의존성을 제거할 수 있습니다.

2)go 애플리케이션을 다단계 빌드로 이미지를 생성

  • 디렉토리를 생성하고 그 디렉토리로 프롬프트를 이동
    mkdir goapp && cd $_
  • go 파일을 생성(goapp.go)

    package main
    
    import (
        "fmt"
        "time"
    )
    
    func main() {
        for {
            fmt.Println("Hello World")
            time.Sleep(10 * time.Second)
        }
    }
  • golang 설치

    • 다운로드

      wget https://golang.org/dl/go1.19.1.linux-amd64.tar.gz
    • 압축해제

      sudo tar -xzf go1.19.1.linux-amd64.tar.gz -C /usr/local
    • 압축해제된 go/bin 디렉토리를 PATH에 등록(명령어 또는 파일을 아무 곳에서나 사용할 수 있게 하기 위해서)

      • sudo nano /etc/profile 명령을 수행하고 아래 내용 추가

        export PATH=$PATH:/usr/local/go/bin

      • 위의 내용을 추가한 후 저장하고 source /etc/profile

    • 버전 확인

      go version

  • 이전에 만든 go 파일 실행
    • 빌드 : go build 파일명
      go build goapp.go
    • 실행 : ./파일명에서 확장자를 제거한 부분
      ./goapp
  • Dockerfile을 생성해서 작성

    FROM golang:1.15-alpine3.12 AS gobuilder-stage
    
    WORKDIR /usr/src/goapp
    
    COPY goapp.go .
    
    RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o /usr/local/bin/gostart
    
    FROM scratch AS runtime-stage
    
    COPY --from=gobuilder-stage /usr/local/bin/gostart /usr/local/bin/gostart
    
    CMD ["/usr/local/bin/gostart"]
  • Dockerfile 빌드
    docker build -t 이미지이름:태그 [-f Dockerfile 경로] .
    docker build -t goapp:1.0 .
  • 이미지 확인
    docker images
  • 컨테이너로 실행
    docker run --name goapp-deploy goapp:1.0

0개의 댓글