Docker

Dockerfile Instuction

DJ.Kang 2025. 3. 11. 16:25

□ FROM

컨테이너의 기반이 되는 이미지를 지정

FROM openjdk:17-jdk-slim

□ WORKDIR

컨테이너 내부에서 작업할 디렉토리를 지정

WORKDIR /app

□ COPY

로컬 파일을 컨테이너 내부로 복사할 때 사용

COPY target/*.jar app.jar  # Maven 빌드 결과 복사
COPY build/libs/*.jar app.jar  # Gradle 빌드 결과 복사

□ ADD

COPY와 유사, ADD는 .tar.gz같은 압축파일을 자동으로 압축해제함

ADD myfile.tar.gz /app/  # 압축 해제됨

□ RUN

컨테이너 이미지를 빌드할 때 명령어를 실행

RUN mvn clean package -DskipTests # 테스트 제외하고 Maven 빌드 실행
RUN ./gradlew clean build -x test  # 테스트 제외하고 Gradle 빌드 실행

□ CMD

컨테이너가 실행될 때 실행되는 기본 명령어

CMD ["java", "-jar", "app.jar"]

※ CMD는 docker run 명령어를 실행할 때 바꿀 수 있다.

docker run my-app echo "Hello"

→ 이렇게 하면 "Hello"가 실행되고 CMD는 무시된다.

□ ENTRYPOINT

CMD와 유사, 반드시 실행해야 하는 명령어

ENTRYPOINT ["java", "-jar", "app.jar"]

※ CMD와 다르게 docker run 시 추가 인자를 넣을 수 있다.

docker run my-app --server.port=8081

→ java -jar app.jar --server.port=8081 실행됨

□ ENV

컨테이너 내부에서 사용할 환경 변수를 설정

ENV SPRING_DATASOURCE_URL=jdbc:mysql://db:3306/mydb

□ EXPOSE

컨테이너에서 사용할 포트를 지정하지만, 자동으로 외부에 개방되지는 않는다.

EXPOSE 8080

※ 외부에서 접근하려면 docker run -p 8080:8080을 실행해야 한다.

□ VOLUME

컨테이너가 종료되어도 유지해야 하는 데이터를 저장하는 디렉토리를 지정

VOLUME /data
docker run -v /host/data:/data my-app

→ 실행 시 -v 옵션으로 호스트 디렉토리와 연결 가능

□ ARG

ENV와 유사, 빌드할 때만 사용

ARG JAR_FILE=target/app.jar
COPY ${JAR_FILE} app.jar

- 빌드할 때 값을 지정

docker build --build-arg JAR_FILE=target/custom-app.jar -t my-app .

□ HEALTHCHECK

컨테이너가 정상적으로 실행 중인지 확인하는 명령어

- Spring Boot 서버 상태 체크

HEALTHCHECK --interval=30s --timeout=10s --retries=3 \
  CMD curl -f http://localhost:8080/actuator/health || exit 1

□ LABEL

컨테이너에 메타데이터를 추가할 수 있다.

LABEL maintainer="your-email@example.com"
LABEL version="1.0"