본문 바로가기
Docker

[Docker] COPY : 파일 복사

by 괘발자 2025. 5. 8.

COPY

Docker의 COPY 명령어는 호스트 컴퓨터의 파일이나 디렉토리를 Docker 이미지 안으로 복사할 때 사용된다.

 

⚠️ COPY의 기본 규칙

1️⃣ COPY는 Docker 빌드 컨텍스트 내의 파일만 복사할 수 있다.

  • Docker 빌드를 실행할 때, 사용자가 지정한 디렉토리가 "빌드 컨텍스트"가 된다.
  • COPY와 ADD 명령어는 이 컨텍스트 내부에 존재하는 파일이나 디렉토리만 참조할 수 있다.

2️⃣ 컨텍스트 외부 경로(`../` 등)는 사용할 수 없다.

  • 보안과 일관성을 위해 Docker는 반드시 컨텍스트 외부 경로에 접근을 제한한다.

이러한 규칙이 존재하는 이유는 호스트 시스템의 민감한 정보(ex. ~/.ssh, ../secrets 등)가 실수로 Docker 이미지에 포함되는 것을 막기 위해 존재한다.

 

+ 빌드 컨텍스트

Docker가 Dockerfile을 기반으로 이미지를 빌드할 때, 참조 가능한 파일들이 모여 있는 디렉토리를 말한다.

 COPY 사용

# 문법
COPY [호스트 컴퓨터에 있는 복사할 파일의 경로(소스 경로)] [컨테이너에서 파일이 위치할 경로(대상 경로)]

# 예시
COPY app.txt /app.txt

 

파일 복사

1️⃣ app.txt 생성

2️⃣ Dockerfile 생성

FROM ubuntu

COPY app.txt /app.txt

ENTRYPOINT ["/bin/bash", "-c", "sleep 500"] # 디버깅용 코드

 

3️⃣ 이미지 생성 및 컨테이너 실행

$ docker build -t my-server .
$ docker run -d my-server
$ docker exec -it [Container ID] bash

$ ls

 

디렉토리 내 모든 파일 복사

1️⃣ my-app 디렉토리 생성, 해당 디렉토리 내 파일 생성

2️⃣ Dockerfile 생성

로컬 환경의 my-app 디렉토리를 우분투 환경의 root 경로 아래 my-app 디렉토리에 복사한다.

FROM ubuntu

COPY my-app /my-app/

ENTRYPOINT ["/bin/bash", "-c", "sleep 500"] # 디버깅용 코드

 

📌 디렉토리의 소스 경로 작성 시, `디렉토리명`과 `디렉토리명/`은 다르다.

COPY 명령에서 소스 경로가 `my-app`이면 디렉토리 자체를 복사하고, `my-app/` 이면 디렉토리 내부 내용만 복사한다.

 

`디렉토리명` : 디렉토리 자체 복사 → /my-app/my-app/...

`디렉토리명/` : 디렉토리 내부 내용 복사 → /my-app/...

 

디렉토리의 중첩을 피하려면  `디렉토리명/` 형식으로 복사하는 것이 일반적이다.

 

 

3️⃣ 이미지 생성 및 컨테이너 실행

$ docker build -t my-server .
$ docker run -d my-server
$ docker exec -it [Container ID] bash

$ ls

 

와일드카드  사용

1️⃣ app.txt, readme.txt 파일 생성

2️⃣ Dockerfile 생성

로컬 환경에서 확장자가 txt인 모든 파일을 우분투 환경의 text-files 디렉토리 아래로 복사한다.

FROM ubuntu

COPY *.txt /text-files/

ENTRYPOINT ["/bin/bash", "-c", "sleep 500"] # 디버깅용 코드

 

3️⃣ 이미지 생성 및 컨테이너 실행

$ docker build -t my-server .
$ docker run -d my-server
$ docker exec -it [Container ID] bash

$ ls

.dockerignore 사용

특정 파일 또는 디렉토리의 복사를 원치 않는 경우, .dockerignore 파일을 작성한다.

이는 불필요한 파일 복사를 방지해 빌드 속도를 높이고, 민감한 정보 노출을 막아 보안에도 도움이 된다.

 

1️⃣ .dockerignore 생성

readme.txt

 

2️⃣ Dockerfile 생성

FROM ubuntu

COPY ./ /

ENTRYPOINT ["/bin/bash", "-c", "sleep 500"] # 디버깅용 코드

 

3️⃣ 이미지 생성 및 컨테이너 실행

$ docker build -t my-server .
$ docker run -d my-server
$ docker exec -it [Container ID] bash

$ ls

 

✅ COPY 정리

  • COPY는 컨텍스트 내부의 파일만 복사 가능
  • 소스 경로 `디렉토리명` vs `디렉토리명/`은 복사 대상이 다름
  • 대상 경로는 절대경로(`/`)를 쓰는 것이 명확함
  • `.dockerignore`로 민감하거나 불필요한 파일은 제외

 

[출처]

https://jscode.notion.site/COPY-42437bd782584e45a12c89cb3ba48f95