CI/CD 파이프라인용 경량 Dockerfile 작성 및 빌드 최적화

💡 핵심 요약 (Executive Summary)

본 가이드는 cicd oci Dockerfile 핵심 가이드 및 실전 아키텍처의 핵심 개념, 실전 구성 명령어 및 아키텍처 베스트 프랙티스를 다룹니다. 클라우드 네이티브 및 인프라 엔지니어링 실무에 즉시 활용 가능하도록 체계적으로 정리했습니다.

📑 Table of Contents
Command
bash
# Dockerfile 경로에서
docker build -t ${registry}/${image}:${tag} .
Configuration
COPY
Reference & Guidelines (NOTE)

COPY 의 마지막 인자값은 Destination Directory이다.

앞은 모두 Source이다.

docker
COPY <Source 1> <Source 2> <Source 3> ... <Destination>
RUN, CMD, ENTRYPOINT
명령어 실행 시점 목적 덮어쓰기 가능 여부
RUN 🏗️ 이미지 빌드 시 이미지를 구성하기 위한 명령 실행 (파일 설치, 빌드 등) ❌ (이미지에 결과가 반영됨)
CMD 🚀 컨테이너 실행 시 동적 실행명령 or ENTRYPOINT의 동적 인자값 ✅ docker run, K8s args
ENTRYPOINT 🚀 컨테이너 실행 시 고정 실행명령 ✅ K8s command
RUN — 다회 선언
yaml
RUN apt-get install -y curl
CMD — 1회 선언
yaml
CMD ["nginx", "-g", "daemon off;"]
  • ENTRYPOINT없이 CMD만 작성할 경우 K8s command로 전체 오버라이드 가능
  • ENTRYPOINT가 있으면 항상 CMD는 ENTRYPOINT의 인자값으로 적용됨
ENTRYPOINT — 1회 선언
yaml
ENTRYPOINT ["nginx"]
Features
CMD와 ENTRYPOINT 차이 이해하기
  • 아래의 둘의 정적인 수행동작은 동일하다.
docker
#1
  ENTRYPOINT ["python3"]
  CMD ["app.py"]

  #2
  ENTRYPOINT ["python3", "app.py"]
  • docker명령어의 인자값으로 CMD는 오버라이드 가능하다.
bash
docker run myimage test.py
  • 결과적으로 실행되는 ENTRYPOINT
bash
#1
  python3 test.py

  #2
  python3 app.py
Jar Sample1
bash
FROM $baseImage
ADD $jarfile /app
WORKDIR /app
USER $user
ENTRYPOINT ["java", "-Dfile.encoding=UTF8", "-Duser.timezone=Asia/Seoul", "-jar", "$jarfile"]
War Sample – Springboot War
bash
FROM $baseImage
ADD $warfile /app
WORKDIR /app
USER $user
ENTRYPOINT ["java", "-Dfile.encoding=UTF8", "-Duser.timezone=Asia/Seoul", "-jar", "$warfile"]
War Sample – Spring War —TODO
bash
# Step 1: Use an official Tomcat base image
FROM tomcat:9.0-jdk11

# Step 2: Remove the default ROOT application
RUN rm -rf /usr/local/tomcat/webapps/ROOT

# Step 3: Copy your WAR file into the container
COPY myapp.war /usr/local/tomcat/webapps/ROOT.war

# Step 4: Expose the default Tomcat port
EXPOSE 8080

# Step 5: Start Tomcat
CMD ["catalina.sh", "run"]
War Sample – Spring War – Multi-Stage (Docker build중에 Maven Build)
bash
# Stage 1: Build the application
FROM maven:3.8.6-openjdk-11 AS builder

WORKDIR /app

# Copy source files
COPY src /app/src
COPY pom.xml /app

# Package the application
RUN mvn clean package -DskipTests

# Stage 2: Deploy to Tomcat
FROM tomcat:9.0-jdk8
WORKDIR /usr/local/tomcat

# Remove default ROOT application
RUN rm -rf ./webapps/ROOT

# Copy WAR file from the build stage
COPY --from=builder /app/target/demo2-1.0-SNAPSHOT.war ./webapps/ROOT.war

# Expose the default Tomcat port
EXPOSE 8080

# Start Tomcat
CMD ["sh", "-c", "sh ./bin/catalina.sh run"]
  • Commands
bash
docker build -t test.io/demo2:latest . --platform=linux/amd64
  docker run -d -p 80:8080 test.io/demo2:latest
Alpine 이미지에 openssh-client 추가
bash
FROM alpine:latest

# Install the OpenSSH client
RUN apk --no-cache add openssh-clien

# Your other Dockerfile instructions here

CMD ["/bin/sh"]

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *