Dockerfile에서 COPY
및 ADD
명령 의 차이점은 무엇 이며 언제 다른 것을 사용할 것입니까?
COPY <src> <dest>
COPY 명령어는 새 파일
<src>
을 경로의 컨테이너 파일 시스템에 복사 하여 추가합니다.<dest>
ADD <src> <dest>
ADD 명령어는 새 파일
<src>
을 path의 컨테이너 파일 시스템에 복사 하여 추가합니다<dest>
.
답변
동작에 대한 자세한 설명은 ADD
및 COPY
설명서를 확인해야 하지만 간단히 말해서 다음과 같은 여러 가지 ADD
작업을 수행 할 수 있습니다 COPY
.
ADD
<src>
URL이 될 수 있습니다- 다음은 주석을 참조하여
ADD
설명서에 다음과 같이 명시되어 있습니다.
인식 된 압축 형식 (ID, gzip, bzip2 또는 xz)의 로컬 tar 아카이브 인 경우 디렉토리로 압축이 풀립니다. 원격 URL의 리소스는 압축 해제되지 않습니다.
Dockerfile을 작성 하는 모범 사례COPY
는 마법이 ADD
필요하지 않은 위치를 사용 하도록 제안 합니다. 그렇지 않으면 ( 이 답변을 찾아야했기 때문에 ) keep_this_archive_intact.tar.gz
컨테이너 에 복사하려고 할 때 언젠가 놀랄 것입니다. 대신 파일 시스템에 내용을 뿌립니다.
답변
답변
그 시점에서 공식 문서가 있습니다 : Dockerfile 작성을위한 모범 사례
이미지 크기가 중요하기 때문에
ADD
원격 URL에서 패키지를 가져 오는 데 사용 하지 않는 것이 좋습니다.curl
또는wget
대신 사용해야 합니다. 그렇게하면 더 이상 필요없는 파일을 추출한 후 삭제할 수 있으며 이미지에 다른 레이어를 추가 할 필요가 없습니다.
RUN mkdir -p /usr/src/things \
&& curl -SL http://example.com/big.tar.gz \
| tar -xJC /usr/src/things \
&& make -C /usr/src/things all
ADD
tar 자동 추출 기능이 필요하지 않은 다른 항목 (파일, 디렉토리)의 경우 항상을 사용해야COPY
합니다.
답변
Docker 문서에서 :
추가 또는 복사
ADD와 COPY는 기능적으로 비슷하지만 일반적으로 COPY가 바람직합니다. ADD보다 투명하기 때문입니다. COPY는 로컬 파일을 컨테이너로 복사하는 기본 기능 만 지원하는 반면 ADD에는 로컬 전용 tar 추출 및 원격 URL 지원과 같은 일부 기능이 즉시 눈에 띄지 않습니다. 결과적으로 ADD를 가장 잘 사용하는 것은 ADD rootfs.tar.xz /에서와 같이 이미지에 로컬 tar 파일 자동 추출입니다.
더보기 : Dockerfile 작성을위한 모범 사례
답변
/usr/local
컨테이너에 xx.tar.gz를 추가하려면 압축을 풀고 쓸모없는 압축 패키지를 제거하십시오.
복사의 경우 :
COPY resources/jdk-7u79-linux-x64.tar.gz /tmp/
RUN tar -zxvf /tmp/jdk-7u79-linux-x64.tar.gz -C /usr/local
RUN rm /tmp/jdk-7u79-linux-x64.tar.gz
ADD의 경우 :
ADD resources/jdk-7u79-linux-x64.tar.gz /usr/local/
ADD는 로컬 전용 tar 추출을 지원합니다. 그 외에도 COPY는 3 개의 레이어를 사용하지만 ADD는 1 개의 레이어 만 사용합니다.
답변
COPY
호스트에서 이미지로 파일 / 디렉토리를 복사합니다.
ADD
호스트에서 이미지로 파일 / 디렉토리를 복사하지만 원격 URL을 가져오고 TAR 파일을 추출 할 수도 있습니다 …
COPY
파일 및 / 또는 디렉토리를 빌드 컨텍스트로 간단히 복사하는 데 사용하십시오 .
사용 ADD
등, 원격 리소스를 다운로드 TAR 파일을 추출하기위한 ..
답변
Docker 문서에서 :
https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/#add-or-copy
“ADD와 COPY는 기능적으로 비슷하지만 일반적으로 COPY가 선호됩니다. ADD보다 투명하기 때문입니다. COPY는 로컬 파일을 컨테이너로 복사하는 기본 기능 만 지원하지만 ADD에는 로컬 전용 tar 추출 및 ADD rootfs.tar.xz /에서와 같이 ADD를 가장 잘 사용하는 것은 이미지에 로컬 tar 파일을 자동 추출하는 것입니다.
컨텍스트와 다른 파일을 사용하는 여러 Dockerfile 단계가있는 경우 한 번에 하나씩이 아니라 개별적으로 복사하십시오. 이렇게하면 특별히 필요한 파일이 변경 될 경우 각 단계의 빌드 캐시가 무효화됩니다 (단계를 다시 실행해야 함).
예를 들면 다음과 같습니다.
COPY requirements.txt /tmp/
RUN pip install --requirement /tmp/requirements.txt
COPY . /tmp/
COPY를 넣을 때보 다 RUN 단계에 대한 캐시 무효화가 줄어 듭니다. 그 전에 / tmp /.
이미지 크기가 중요하기 때문에 ADD를 사용하여 원격 URL에서 패키지를 가져 오는 것은 권장하지 않습니다. 대신 curl 또는 wget을 사용해야합니다. 그렇게하면 더 이상 필요없는 파일을 추출한 후 삭제할 수 있으며 이미지에 다른 레이어를 추가 할 필요가 없습니다. 예를 들어 다음과 같은 일을 피해야합니다.
ADD http://example.com/big.tar.xz /usr/src/things/
RUN tar -xJf /usr/src/things/big.tar.xz -C /usr/src/things
RUN make -C /usr/src/things all
대신 다음과 같은 작업을 수행하십시오.
RUN mkdir -p /usr/src/things \
&& curl -SL htt,p://example.com/big.tar.xz \
| tar -xJC /usr/src/things \
&& make -C /usr/src/things all
ADD의 tar 자동 추출 기능이 필요하지 않은 다른 항목 (파일, 디렉토리)의 경우 항상 COPY를 사용해야합니다. “
