본문 바로가기

DevOps

🐳 Dockerfile 명령어 정리

728x90

1️⃣ 이미지 기반

명령어 설명 예시
FROM 베이스 이미지 지정 FROM openjdk:17-jdk
ARG 빌드 시점 변수 ARG VERSION=1.0

2️⃣ 메타데이터 & 라벨

명령어 설명 예시
LABEL 이미지 메타데이터 추가 LABEL maintainer="dev@company.com"
ENV 환경 변수 설정 ENV SPRING_PROFILES_ACTIVE=prod

3️⃣ 파일/디렉터리 작업

명령어 설명 예시
COPY 파일/디렉터리 복사 COPY target/myapp.jar /app/myapp.jar
ADD COPY와 비슷 + URL 다운로드 가능 ADD https://example.com/file.tar.gz /tmp/
WORKDIR 작업 디렉터리 지정 WORKDIR /app

4️⃣ 빌드 / 실행 관련

명령어 설명 예시
RUN 이미지 빌드 시 명령어 실행 RUN apt-get update && apt-get install -y curl
CMD 컨테이너 실행 시 기본 명령어 CMD ["java", "-jar", "/app/myapp.jar"]
ENTRYPOINT 컨테이너 실행 시 고정 명령어 ENTRYPOINT ["java","-jar","/app/myapp.jar"]

⚠️ CMD vs ENTRYPOINT
CMD: 기본값, 필요하면 덮어쓰기 가능
ENTRYPOINT: 고정값, 컨테이너 실행 시 항상 실행

CMD vs RUN

  1. CMD
  • 용도: 컨테이너가 실행될 때 기본으로 실행할 명령어와 인자를 지정
  • 특징:
    • 컨테이너 실행 시 덮어쓰기 가능
    • Docker run 시 인자를 넣으면 CMD가 대체됨

예시

FROM ubuntu:22.04
CMD ["echo", "Hello World"]

 

위 Dockerfile을 myimage 라는 이미지로 빌드했을 경우, 

docker run myimage             # Hello World 출력
docker run myimage echo "Hi!"  # CMD 대신 "Hi!" 출력
  1. ENTRYPOINT
  • 용도: 컨테이너가 항상 실행해야 하는 주요 명령어 지정
  • 특징:
    • Docker run 시 인자를 넣어도 ENTRYPOINT 자체는 바뀌지 않음
    • CMD와 조합 가능 → CMD는 ENTRYPOINT의 기본 인자 역할

예시

FROM ubuntu:22.04
ENTRYPOINT ["echo"]
CMD ["Hello World"]

 

위 Dockerfile을 myimage 라는 이미지로 빌드했을 경우, 

docker run myimage         # echo Hello World
docker run myimage Hi!     # echo Hi!  → ENTRYPOINT 유지, CMD 덮어쓰기

각각을 언제 사용할까?

  1. CMD
    • 컨테이너 실행 시 유연하게 변경 가능한 기본 명령어가 필요할 때
    • 예: CMD ["nginx", "-g", "daemon off;"] → 필요 시 다른 명령어로 실행 가능
  2. ENTRYPOINT
    • 컨테이너가 반드시 실행해야 하는 명령어를 고정할 때
    • 예: Spring Boot 애플리케이션 실행
ENTRYPOINT ["java", "-jar", "/app/myapp.jar"]
  • 필요하면 CMD를 인자로 사용
ENTRYPOINT ["java", "-jar", "/app/myapp.jar"]
CMD ["--spring.profiles.active=prod"]

 

💡

  • 애플리케이션 컨테이너: ENTRYPOINT 고정 + CMD로 기본 인자 관리
  • 유틸리티 컨테이너(테스트, 배치): CMD만 사용 → 실행 시 유연하게 바꿀 수 있음

5️⃣ 포트 & 볼륨

명령어 설명 예시
EXPOSE 컨테이너 포트 노출 EXPOSE 8080
VOLUME 데이터 유지 볼륨 지정 VOLUME /app/data

6️⃣ 빌드 캐시 관련

명령어 설명 예시    
USER 컨테이너 실행 사용자 USER appuser    
HEALTHCHECK 컨테이너 상태 검사 `HEALTHCHECK CMD curl -f http://localhost:8080/ || exit 1`    

예시 Dockerfile (Spring Boot 기준)

FROM openjdk:17-jdk
LABEL maintainer="dev@company.com"

WORKDIR /app
COPY target/myapp.jar /app/myapp.jar
ENV SPRING_PROFILES_ACTIVE=prod

EXPOSE 8080
ENTRYPOINT ["java","-jar","/app/myapp.jar"]

728x90
반응형

'DevOps' 카테고리의 다른 글

🐳 Docker 명령어 정리  (1) 2025.08.31
Kubernetes - Readiness probe vs Liveness probe  (2) 2025.08.17
Kubernetes - 서비스 port 와 ingress  (2) 2025.08.17
Kubernetes - Cluster 란? (node와 pod와의 관계)  (2) 2025.08.17
Kubernetes 란?  (1) 2024.09.30