설명
ADD는 단순 파일 복사 외에도 원격 URL 다운로드나 자동 압축 해제를 수행할 수 있습니다. 로컬 파일을 복사하려는 목적이라면 이런 추가 동작은 불필요하고, Dockerfile을 읽는 사람이 실제 의도를 파악하기 어렵게 만듭니다.
로컬 파일을 이미지에 넣는 목적이라면 COPY가 더 명확합니다. 원격 아티팩트를 받아야 하는 경우에는 별도 검증이나 ADD --checksum 같은 무결성 확인을 함께 사용해야 하며, 로컬 복사와 원격 다운로드를 같은 패턴으로 섞지 않는 것이 좋습니다.
잠재적 영향
- 로컬 복사인지 압축 해제 또는 원격 다운로드인지 Dockerfile 의도가 불명확해질 수 있습니다.
- 로컬 tar 파일이 예상과 다르게 자동 압축 해제될 수 있습니다.
- 이미지 생성 과정의 재현성과 유지보수성이 떨어질 수 있습니다.
해결 방법
- 로컬 파일 복사에는
ADD대신COPY를 사용하세요. - 원격 파일 다운로드가 필요하면 체크섬 검증을 포함한 별도 패턴으로 분리하세요.
- Dockerfile에서
ADD가 정말 필요한 압축 해제 또는 원격 아티팩트 용도인지 점검하세요.
예시
로컬 JAR 복사 방식을 비교하는 기존 예제입니다. JAR_FILE은 빌드 컨텍스트의 실제 파일로 지정하고 운영 이미지에는 지원되는 Java 버전을 사용하세요.
변경 전
dockerfile
FROM openjdk:10-jdk
VOLUME /tmp
ARG JAR_FILE
ADD ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
변경 후
dockerfile
FROM openjdk:10-jdk
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
설명:
- 변경 전: 로컬 아티팩트를
ADD로 처리해 Dockerfile 동작이 더 복잡하고 예측하기 어려워집니다. - 변경 후:
COPY로 로컬 파일 복사 의도를 분명히 합니다. 복사할 아티팩트의 신뢰성과 무결성은 별도로 확인해야 합니다.