![[도커 #6] 도커 COPY 및 도커파일 주요 명령어](https://image.inblog.dev?url=https%3A%2F%2Finblog.ai%2Fapi%2Fog-custom%3Ftitle%3D%255B%25EB%258F%2584%25EC%25BB%25A4%2B%25236%255D%2B%25EB%258F%2584%25EC%25BB%25A4%2BCOPY%2B%25EB%25B0%258F%2B%25EB%258F%2584%25EC%25BB%25A4%25ED%258C%258C%25EC%259D%25BC%2B%25EC%25A3%25BC%25EC%259A%2594%2B%25EB%25AA%2585%25EB%25A0%25B9%25EC%2596%25B4%26tag%3DTemplate%2B1%26description%3D%26template%3D3%26backgroundImage%3Dhttps%253A%252F%252Fsource.inblog.dev%252Fog_image%252Fdefault.png%26bgStartColor%3D%2523a8e8ec%26bgEndColor%3D%2523a8e8ec%26textColor%3D%2523000000%26tagColor%3D%2523000000%26descriptionColor%3D%2523000000%26logoUrl%3D%26blogTitle%3DGyeongwon%2527s%2Bblog&w=2048&q=75)
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
이라는 이름의 이미지를 생성

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