ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • dockerfile 관련 정리
    인프라 2022. 12. 9. 14:05
    728x90
    반응형
    SMALL

    이 포스팅은 dockerfile 작성 시 공부했던 내용을 정리하는 포스팅이다.

     

    Dockerfile 멀티 스테이지

    하나의 Dockerfile로 이미지를 생성할 경우, 실행 파일의 크기가 너무 클 경우 두 개의 스테이지로 나눠서 필요한 실행파일만 최종 결과물에 포함 시킬 수 있다.

    FROM golang
    ADD main.go /root
    WORKDIR /root
    RUN go build -o /root/mainApp /root/main.go
    CMD ["./mainApp"]

    위와 같은 dockerfile로 이미지를 만들 경우 실행 파일의 크기가 엄청 커지게 된다.

    FROM golang
    ADD main.go /root
    WORKDIR /root
    RUN go build -o /root/mainApp /root/main.go
    
    FROM alpine:latest
    WORKDIR /root
    COPY --from=0 /root/mainApp .
    CMD ["./mainApp"]
    

    위와 같이 멀티 스테이지로 이미지를 구성하게 될 경우 첫 번째 FROM을 통해 만들어진 /root/mainApp만 두 번째 FROM으로 옮겨서 실해아게 되므로 첫 번째 도커파일을 통해 만들어진 이미지보다 크기를 줄일 수 있다.

    여기서 FROM golang이 -from=0이 되고 FROM alpine:latest가 -from=1이 된다.

    만약 FROM golang as builder와 같은 방식으로 작성한 경우 다른 스테이지에서 -from=builder로도 표현 가능하다.

     

    CMD와 ENTRYPOINT의 차이

    CMD와 ENTRYPOINT의 공통점은 컨테이너가 시작될 때 명령어를 실행해준다는 것이다.

    둘의 차이점은 CMD와 ENTRYPOINT가 함께 쓰여질 경우 CMD가 ENTRYPOINT에 인자값으로 들어간다는 것이다.

    예시)

    docker run -it --name no_entrypoint ubuntu:14:04 /bin/bash
    • CMD = /bin/bash
    • ENTRYPOINT = none
    • cmd로 bash shell을 실행하도록 설정
    docker run -it --entrypoint="echo" --name yes_entrypoint ubuntu:14.04 /bin/bash
    • CMD = /bin/bash
    • ENTRYPOINT = echo
    • CMD와 ENTRYPOINT가 동시에 존재하므로 CMD는 ENTRYPOINT의 인자값으로 역할을 한다. 즉, 컨테이너를 실행할 경우 echo "/bin/bash"가 실행된다. -> 컨테이너를 생성과 동시에 안으로 진입할 경우 /bin/bash가 출력된다.

    ENTRYPOINT는 스크립트 파일을 실행하도록 설정할 수 있다.

    docker run -it --name entrypoint_sh --entrypoint="/test.sh" ubuntu:14.04 /bin/bash
    • 컨테이너 실행 시 test.sh 스크립트 파일이 실행되고, 인자값으로 CMD인 "/bin/bash" 가 들어가게 된다.

     

    명령어 입력 차이(JSON, 일반 형식)

    일반 형식

    CMD echo hi
    • 컨테이너 내부에서 실행될 경우 /bin/sh -c 'echo hi'로 실행된다.

    JSON 형식

    CMD ["echo","hi"]
    • 컨테이너 내부에서 실행될 경우 echo hi로 실행된다.

    일반 형식과 JSON 형식의 차이는 앞에 /bin/sh -c가 붙느냐 안 붙느냐의 차이이다.

    반응형
    LIST

    '인프라' 카테고리의 다른 글

    aws 인스턴스 & 도커 자동 시작  (0) 2022.12.12
    쿠버네티스 시작  (0) 2022.12.12
    Nginx Load balancing, 도커 컨테이너 실습  (0) 2022.12.08
    Nginx 개념 + 간단 실습  (0) 2022.12.08
    컨테이너 run 옵션 정리  (0) 2022.12.08

    댓글

Designed by Tistory.