Quick Comparison
| source와 원하는 결과 | 선택 | 주의할 점 |
|---|---|---|
| build context의 code·config를 그대로 넣기 | COPY | .dockerignore로 context 범위 제한 |
| 다른 build stage의 artifact만 넣기 | COPY --from=build | 필요한 file만 지정 |
| local tar를 build 중 자동으로 풀기 | ADD | archive가 자동 해제됨 |
| remote URL을 build input으로 쓰기 | ADD --checksum 검토 | checksum·cache·network 의존성을 명시 |
COPY package.json package-lock.json ./
RUN npm ci
COPY src/ ./src/
COPY --from=build /app/dist/ /usr/share/nginx/html/
ADD archive.tar.gz /opt/archive/일반 file copy는 COPY가 기본입니다. ADD는 local tar 자동 해제와 remote URL처럼 추가 동작이 필요할 때만 사용해 Dockerfile에서 build input의 변환을 드러냅니다.
COPY source와 destination
COPY <src> ... <dest>의 source는 build context, 다른 build stage, named context, image에서 올 수 있고 마지막 argument는 destination입니다. context 밖의 local file은 COPY할 수 없으며, .dockerignore로 제외한 file도 source로 쓸 수 없습니다.
# directory 자체가 아니라 src/ 안의 내용을 /app/src/로 복사
COPY src/ /app/src/
# 공백이 있는 path는 JSON array form
COPY ["file with spaces.txt", "/data/"]
# build stage artifact만 final image로 전달
COPY --from=build /app/server /usr/local/bin/serverdestination의 trailing slash는 file을 directory에 둘지 판단하는 데 중요합니다. 여러 source를 지정할 때 destination은 directory여야 합니다. source file과 destination에 같은 이름의 directory가 충돌하거나 directory를 file 위에 복사하면 build가 실패할 수 있습니다.
ADD의 추가 동작
ADD는 COPY와 비슷하게 source를 image filesystem에 넣지만, local tar archive를 자동으로 extract하고 remote URL을 source로 받을 수 있습니다. URL source는 Dockerfile 안에 network download와 cache invalidation 규칙을 넣는 선택이므로, 변경 가능한 URL을 그냥 두지 말고 digest checksum을 지정합니다.
# local tar: destination에서 자동 extract
ADD archive.tar.gz /opt/app/
# remote file: checksum으로 받아야 할 내용을 고정
ADD --checksum=sha256:<hash> https://example.com/tool.tar.gz /tmp/tool.tar.gzremote archive URL은 자동 extract되지 않고 file로 저장됩니다. local tar만 auto-extraction 대상입니다. source code repository를 download해야 한다면 build context를 commit으로 고정하거나 build stage에서 검증 가능한 fetch를 수행하는 편이 dependency와 authentication 경계를 드러내기 쉽습니다.
cache와 권한
COPY 또는 ADD source의 content와 metadata 변화는 해당 layer cache를 무효화합니다. dependency manifest를 먼저 copy하고 install한 뒤 application source를 copy하면 source code 수정마다 dependency install layer가 매번 무효화되는 일을 줄일 수 있습니다.
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
COPY src/ ./src/Linux container에서는 COPY --chown=app:app과 COPY --chmod=755로 source owner와 mode를 조정할 수 있습니다. COPY --chown은 Windows container에서 동작하지 않으며, build context의 secret·.git·local artifact를 COPY . .로 넓게 넣지 않도록 .dockerignore와 source 목록을 함께 관리합니다.
ADD . /app은 file copy인지 archive extract인지 Dockerfile만으로 판단하기 어렵게 만듭니다. 복사 목적이면 COPY를 쓰고, ADD가 필요한 경우에는 local tar·checksum·remote source라는 추가 동작을 코드와 review에서 분명히 드러내십시오.
참고 링크
2 sources