인프라

dockerfile 관련 정리

cottoncover 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