💡 핵심 요약 (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"]
Leave a Reply