[도커 #6] 도커 COPY 및 도커파일 주요 명령어

COPY 개념과 Dokerfile의 주요 명령어들을 정리 하였습니다.
도경원's avatar
Jul 30, 2025
[도커 #6] 도커 COPY 및 도커파일 주요 명령어
COPY 는 주로 Dockerfile에서 사용되는 명령어고, 이미지 안에 정적인 파일을 포함시킬 때 사용한다.

1. COPY란 ?

Dockerfile에서 호스트의 파일/디렉토리를 컨테이너 이미지 안에 복사하는 명령어
COPY [소스 경로] [컨테이너 내 대상 경로]

예시

COPY ./htdocs /usr/local/apache2/htdocs/
.htdocs파일을 컨테이너 이미지 안의 /usr/share/nginx/html/ 등으로 복사한다는 뜻이다.

Dockerfile에서의 예시

FROM nginx COPY ./html /usr/share/nginx/html COPY ./conf.d /etc/nginx/conf.d CMD ["nginx", "-g", "daemon off;"]
nginx 기반 이미지에:
  • html 폴더를 웹 루트에 넣고
  • conf.d에 설정 파일 덮어씌운 다음
  • nginx를 포그라운드로 실행하는 이미지 빌드
COPY ./html ... → 정적 웹 콘텐츠를 이미지에 정적으로 포함
COPY ./conf.d ... → Nginx 설정을 이미지 빌드 실점에 고정
즉, 빌드 후에는 변경 불가. 변경하려면 다시 docker build 해야 함

2. Docker 이미지 빌드 명령어

docker build [옵션] -t 이미지이름[:태그] 경로

예시

docker build -t my-nginx:1.0 .
현재 디렉토리의 Dockerfile을 기반으로 my-nginx:1.0이라는 이름의 이미지를 생성
notion image

3. Dockerfile 주요 명령어 10가지

명령어
설명
실행 시점
캐시 영향
FROM
베이스 이미지 지정
빌드 시작
RUN
쉘 명령 실행 (설치, 빌드 등)
이미지 생성 시
CMD
컨테이너 실행 시 실행할 명령
컨테이너 실행
COPY
호스트 파일 복사
이미지 생성 시
ADD
COPY와 유사하나 기능 추가됨
이미지 생성 시
ENV
환경 변수 설정
이미지 생성 시
EXPOSE
열 포트 명시 (기능적 의미는 없음)
문서화
WORKDIR
작업 디렉토리 설정
이미지 생성 시
ENTRYPOINT
컨테이너 시작 시 실행될 기본 명령 지정
컨테이너 실행
VOLUME
데이터 저장소 디렉토리 명시
문서화 + 생성됨

1️⃣ FROM

FROM ubuntu:20.04
  • 베이스 이미지 지정 (가장 먼저 와야 함)
  • 여러 단계 빌드 시 FROM을 여러 번 쓸 수 있음

2️⃣ RUN

RUN apt update && apt install -y curl
  • 셸 명령어 실행
  • 도커 빌드(이미지 굽는 것) 할 때 실행
  • 이미지 내부에 변경사항을 적용한 새 레이어 생성

3️⃣ CMD

CMD ["node", "app.js"
  • 컨테이너 실행 시(이미지 다 구운 후) 기본 명령어
  • docker run 시 명령어를 지정하면 CMD는 무시됨
  • 자주 ENTRYPOINT와 함께 쓰임

4️⃣ COPY

COPY ./src /app/sr
  • 호스트의 파일/디렉토리를 컨테이너 이미지로 정적으로 복사
  • 정적 배포용 빌드에 적합
  • copy는 zip 파일 던져주면 압축도 풀어줌

5️⃣ ADD

ADD archive.tar.gz /app/
  • COPY + 압축 해제, URL 다운로드 기능
  • 기능은 많지만 예측 불가 → 실무에서는 대부분 COPY 사용

6️⃣ ENV

ENV NODE_ENV=production
  • 환경 변수 설정
  • 환경변수는프로그램 실행 전에 외부에서 주입할 수 있는 설정값이고, 코드 수정 없이 동작을 제어할 수 있는 유연하고 안전한 방법이다.
  • RUN, CMD, ENTRYPOINT 등 다른 명령에서도 사용 가능

7️⃣ EXPOSE

EXPOSE 80
  • 컨테이너가 사용하는 포트를 명시
  • 실제로 포트가 열리는 건 아님 (힌트 느낌)→ p 옵션 필요
  • 문서화 역할 (팀원/도구를 위한)

8️⃣ WORKDIR

WORKDIR /app
  • 이후 명령어의 작업 디렉토리 설정
  • 디렉토리가 없으면 자동 생성됨
  • cd 명령 쓸 필요 없어짐
  • 컨테이너 내부안에 어느 폴더에서 시작하는지..

9️⃣ ENTRYPOINT

ENTRYPOINT ["python", "script.py"]
  • 컨테이너가 시작될 때 무조건 실행되는 명령어
  • CMD와는 다르게 docker run 인자와 합쳐져 실행됨, CMD는 오버라이드 되서 덮어씌워질 수 도 있음
  • 고정된 실행 명령을 설정할 때 사용

🔟 VOLUME

VOLUME ["/data"]
  • 데이터가 저장될 영속적 경로를 명시
  • 실제 마운트는 docker run -v로 해야 함
  • 도커가 볼륨 자동 생성해줄 수 있음

4. Docker file 실전 예시

정적 웹사이트 배포용 Dockerfile (with Nginx)

# 베이스로 nginx 사용 FROM nginx:stable-alpine # 정적 HTML 파일 복사 COPY ./html /usr/share/nginx/html # Nginx 커스텀 설정 덮어쓰기 COPY ./nginx.conf /etc/nginx/nginx.conf EXPOSE 80 # Nginx 실행 (포그라운드로) CMD ["nginx", "-g", "daemon off;"]
💬
COPY로 HTML과 설정 파일을 이미지에 고정
정적 사이트 배포 시 완전 정석
CMD로 nginx 포그라운드 실행 설정
html, nginx.conf의 위치가 잘못되면 nginx 404 발생
실시간 수정은 안 됨 → 개발엔 bind mount 권장

Spring Boot JAR 실행용 Dockerfile

FROM eclipse-temurin:17-jdk-alpine WORKDIR /app COPY ./build/libs/myapp.jar app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "app.jar"]
💬
Spring Boot는 보통 .jar 파일 하나로 빌드됨
이 Dockerfile은 JAR 파일을 직접 실행하는 방식
ENTRYPOINT를 써서 외부 인자 추가 실행 가능
COPY할 JAR 파일 경로 정확히 확인
JAR 빌드가 안 돼 있으면 Docker build 시 실패
 
Share article

Gyeongwon's blog