EMD Blog

Dockerfile 모범사례 본문

Docker

Dockerfile 모범사례

EmaDam 2022. 9. 5. 19:15

빌드 시간 단축하기

  • 캐싱을 활용해 불필요한 빌드과정 제거
  • 캐싱에는 순서가 중요
    • 특정 스텝에서 변화가 발생하면 이후 스텝들은 새로 빌드됨
    • 가장 변하지 않는 스텝을 상위로 자주 변하는 스텝은 하위로
  • 구체적인 COPY
    • COPY . 이런 식으로 하면 어떤 코드가 변경되더라도 새로 빌드됨
  • 캐시할 수 있는 단위 구별
    • 예를 들어 패키지 update와 install을 다른 캐시 단위로 묶으면 예전 버전의 패키지를 다운 받게 될수도 있음

이미지 크기 줄이기

  • 작은 이미지는 배포가 빨라지고 공격 취약점이 작아짐
  • 불필요한 의존성 제거
    • 불필요한 의존성제거 & 디버깅 툴 제거
    • apt의 경우 no-install-recommends 커맨드로 추천 패키지 설치를 막을 수 있음
  • 패키지 매니저 캐시 제거
    • 패키지를 설치한 RUN 스텝 안에서 캐시 제거

유지보수성

  • 가능하면 공식 이미지 사용
    • 모든 설치 과정들이 완료되어 있음
    • best practice가 적용되어 있음
    • 여러 프로젝트에서 같은 base 이미지 사용시 layer 공유 가능
  • 더 구체적인 태그 사용
    • latest 태그 사용하지 말 것 → 시간에 따라 급격한 변화 발생
  • 가장 작은 이미지 사용
    • slim 태그 이미지는 striped down Debian 기초
    • alpine 태그 이미지는 더 작은 알파인 리눅스 기반

재현성

  • 일관된 환경에서 소스 코드 빌드
    • 소스코드를 COPY해서 Container에서 빌드
  • Fetch dependencies in a separate step
    • 캐시 가능한 실행 단위를 나눠 매 코드 변경시마다 의존성을 fetch하지 않도록 해야함
  • 빌드 의존성을 제거하기 위해 다단계 빌드(Multi-stage build) 사용
    • 여러 FROM 구문을 사용해 다단계 빌드
    • 빌드 시점에서 의존성 제거 가능

'Docker' 카테고리의 다른 글

Docker Python slim Image 사용시 mysql_config: not found 이슈  (0) 2022.09.06
Docker bridge 대역 충돌  (0) 2022.09.04