-
dockerfile 관련 정리인프라 2022. 12. 9. 14:05728x90반응형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