Dockerfile의 모든 것
· 약 7분
- FROM: 빌드하는 이미지의 기반 이미지 지정
- RUN: 이미지 빌드 시 컨테이너에서 실행할 명령어 정의
- COPY: 호스트에서 컨테이너로 파일 및 디렉토리 복사
- ADD: COPY + 압축 해제 + URL 다운로드
- 운영 체제를 담은 기반 이미지를 만드는 경우처럼 특수한 경우에만 사용하면 된다.
- 안정성 보장이 되지 않으므로 COPY 를 사용하자.
- CMD: 컨테이너에서 foreground로 실행할 명령어 정의
- ENTRYPOINT: 컨테이너를 실행 가능 파일로 사용할 때 정의하는 명령
- CMD 와 ENTRYPOINT 둘 다 사용 가능
- ARG: docker image build를 실행할 때 사용하는 변수
- ENV: 컨테이너 안의 환경변수 정의
- EXPOSE: 컨테이너가 노출하는 포트
- VOLUME: 호스트나 다른 컨테이너에서 마운트할 수 있는 포인트 생성
- LABEL: 이미지에 추가하는 메타데이터
- STOPSIGNAL: 컨테이너에 전달되면 컨테이너를 종료하는 시스템 시그널 설정
- HEALTHCHECK: 컨테이너 안에서 명령을 실행 후 결과를 헬스 체크에 사용
- USER: 컨테이너 실행 시 컨테이너 사용자
- 이미지 빌드시 USER 뒤에 나오는 RUN 인스트럭션도 해당 사용자의 권한으로 실행된다.
- WORKDIR: 컨테이너의 작업 디렉토리
- ONBUILD: 컨테이너 안에서 실행되는 명령 정의, 이미지에서 실행되지 않는다.
- ONBUILD 를 정의한 이미지를 기반 이미지로 삼아 다른 이미지를 빌드할 때 실행된다.
이미지
린팅
hadolint 를 설치해 Dockerfile best practices 에 기반해 이미지를 생성했는지 검증하자.
기반 이미지
- scratch: 아무 것도 없는 이미지
- https 통신이 필요한 경우 cacert.pem 을 /etc/ssl/certs 에 추가해야한다.
- 디버깅도 힘들다
- busybox: 기본 유틸리티 (echo, ls 등) 이 있는 이미지
- 패키지 관리자가 없다.
- 디버깅은 좀 낫다.
- alpine: busybox 기반으로 4MB 지만
apk
패키지 매니저가 있다.glibc
대신musl
을 쓴다.apk add --no-cache package
apk add --no-cache --virtual=ailas package
&&apk del --no-cache ailas