Dockerfile 명령어 정리
기본 명령어들
FROM
- 베이스 이미지를 지정합니다. 모든 Dockerfile은 반드시 FROM으로 시작 헤야 합니다.
RUN
- 컨테이너 안에서 명령어를 실행하고, 그 결과를 이미지에 반영합니다. 보통 패키지 설치 등에 사용합니다.
CMD
- 컨테이너가 실행될 때 기본적으로 실행할 명령을 지정합니다. 단,
docker run
시 명령어를 지정하면 덮어쓰기 됩니다.
ENTRYPOINT
- 컨테이너 실행 시 항상 실행되는 명령을 지정합니다. CMD와 조합하여 인자처럼 사용할 수 있습니다.
CMD vs ENTRYPOINT
- CMD : 기본 인자. 사용자가 docker run에 명령을 지정하면 무시됨
- ENTRYPOINT : 항상 실행되며, CMD는 ENTRYPOINT의 인사로 전달됨
ENTRYPOINT ["nginx"]
CMD ["-g", "daemon off;"]
>>> nginx -g daemon off;
COPY
- 로컬 파일을 이미지의 특정 위치로 복사합니다.
ADD
- COPY와 유사하지만 URL 다운로드나 앞축 파일 자동 해제 기능도 포함합니다. 일반적으로는 COPY 사용을 권장합니다.
ENV
- 환경변수를 설정합니다.
EXPOSE
- 컨테이너가 사용할 포트를 지정합니다. 실제 포트가 열리지는 않으며 문서화의 의미가 큽니다.
WORKDIR
- 이후 명령어들이 실행될 작업 디렉토리를 설정합니다. cd명령 없이 디렉토리 전환이 가능합니다.
USER
- 명령어를 실행할 사용자가 계정을 지정합니다. 기본은 root 입니다.
추가 기능 명령어들
LABEL
- 이미지에 메타데이터를 추가합니다. (예, 작성자, 버전 등)
MAINTAINER (deprecated)
- 이미지의 작성자를 지정합니다. 대신 LABEL 사용 권장
ONBUILD
- 이 Dockerfile을 기반으로 다른 이미지가 생성될 때 실행할 명령어를 지정합니다., 상속 목적에 사용
HEALTHCHECK
- 컨테이너의 상태를 검사할 명령어를 지정합니다. 주기적으로 실행되며, 실패시 상태가 unhealthy로 변경됩니다.
SHELL
- RUN 등에서 사용할 셀을 지정합니다. 기본은 ["/bin/sh", "-c"] 입니다.
STOPSIGNAL
- 컨테이너 종료 시 보낼 시그널을 지정합니다. 기본은 SIGTERM 입니다.
VOLUME
- 외부에 마운트할 디렉토리를 지정합니다. 컨테이너 실행 시 호스트와 공유할 디렉토리 입니다.
ARG
- 빌드 시점에 사용할 변수를 선언할 수 있습니다. 도커 빌드 시
--build-arg
로 초기화 가능합니다.
좋은 Dockerfile 작성 방법
1. 캐싱
- 빌드 할 때마다 변동 사항이 많이 생기는 부분들을 아래쪽으로 작성하기
- 도커 파일을 빌드하며 명령어를 실행할 때 도커는 진행중인 작업을 캐싱해 놓고 추후 동일한 작업을 수행할 때 재사용을 합니다. 하지만 빌드중 기존(캐싱)과 다른 내용이 나오면 그 이후 부터는 캐싱 된걸 사용하지 못하고 작업을 처리하게 변경된 작업을 가능한 마지막에 두는 것이 빌드 성능을 높이는데 도움을 줄 수 있습니다.
2. ENV
- 배이스 이미지나 프로젝트 별로 빌드시 설정된 환경변수에 따라 로그 출력이나 런타임 성능에 영향을 줄수 있습니다.
3. root 권한 사용하지 않기
- Docker는 기본적으로 컨테이너 내 명령을 root권한으로 실행합니다. 이는 최소 권한 원식에 위배되므로 가능하다면 권한이 제한된 node 사용자를 사용하는 것이 좋습니다.