환경변수 - Dockerfile의`COPY`와`ADD` 명령의 차이점은 무엇입니까?




dockerfile 환경변수 (7)

중요 사항

내 도커 이미지에서 Java 패키지를 COPY 하고 압축을 풀어야했습니다. ADD를 사용하여 만든 도커 이미지 크기를 COPY를 사용하여 만든 크기보다 180MB 더 크게 비교했을 때 tar -xzf * .tar.gz 및 rm * .tar.gz

즉, ADD가 tar 파일을 제거하더라도 여전히 어딘가에 보관됩니다. 그리고 그 이미지를 더 크게 만드는 것!

Dockerfile에서 COPY 명령과 ADD 명령의 차이점은 무엇입니까?

COPY <src> <dest>

COPY 명령은 <src> 새 파일을 복사하여 경로의 <dest> 에있는 컨테이너의 파일 시스템에 추가합니다.

ADD <src> <dest>

ADD 명령은 <src> 새 파일을 복사하여 경로 <dest> 의 컨테이너 파일 시스템에 추가합니다.


COPY 및 ADD는 모두 Dockerfile 지침이며 유사한 목적을 수행합니다. 이 파일을 사용하여 특정 위치의 파일을 Docker 이미지로 복사 할 수 있습니다.

COPY는 src 및 대상을 가져옵니다. Docker 이미지 자체에 호스트 (Docker 이미지를 작성하는 시스템)의 로컬 파일이나 디렉토리에 복사 할 수 있습니다.

ADD를 사용하면이 작업을 수행 할 수 있지만 다른 두 소스도 지원합니다. 먼저 로컬 파일 / 디렉토리 대신 URL을 사용할 수 있습니다. 둘째, 대상에서 대상으로 직접 tar 파일을 추출 할 수 있습니다

ADD의 유효한 유스 케이스는 Docker 이미지의 특정 디렉토리에 로컬 tar 파일을 추출하려는 경우입니다.

로컬 파일을 Docker 이미지로 복사하는 경우 더 명시 적이므로 항상 COPY를 사용하십시오.

참조 : https://nickjanetakis.com/blog/docker-tip-2-the-difference-between-copy-and-add-in-a-dockerile


Docker 문서에서 :

추가 또는 복사

ADD와 COPY는 기능적으로 유사하지만, 일반적으로 COPY가 선호됩니다. ADD보다 투명하기 때문입니다. COPY는 컨테이너에 로컬 파일의 기본 복사 만 지원하며 ADD는 즉시 명확하지 않은 몇 가지 기능 (예 : 로컬 전용 타르 추출 및 원격 URL 지원)을 지원합니다. 결과적으로, ADD의 가장 좋은 용도는 ADD rootfs.tar.xz /와 같이 이미지에 로컬 tar 파일 자동 추출입니다.

More : Dockerfiles 작성을위한 우수 사례


xx.tar.gz를 컨테이너의 /usr/local 에 추가하려면 압축을 풀고 쓸모없는 압축 패키지를 제거하십시오.

COPY :

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는 하나의 레이어 만 사용합니다.


ADDCOPY 문서에서 해당 동작에 대한 철저한 설명을 확인해야하지만 간단히 말해서 ADDCOPY 보다 더 많은 작업을 수행 할 수 있다는 점입니다.

  • ADD 사용하면 <src> 를 URL로 사용할 수 있습니다.
  • ADD<src> 매개 변수가 인식 된 압축 형식의 압축 파일이면 압축이 풀립니다.

Dockerfiles를 작성 하는 모범 사례에서는 ADD 가 필요없는 COPY 사용하는 것이 좋습니다. 그렇지 않으면 keep_this_archive_intact.tar.gz 를 컨테이너에 복사 keep_this_archive_intact.tar.gz 할 때 언젠가는 놀라게 될 것입니다 (대신이 답변을 찾아야 keep_this_archive_intact.tar.gz 대신 내용을 파일 시스템에 스프레이합니다.



docker build -t {image name} -v {host directory}:{temp build directory} .

이것은 파일을 이미지로 복사하는 또 다른 방법입니다. -v 옵션은 빌드 과정에서 사용 된 볼륨을 임시로 생성합니다.

이것은 빌드를위한 호스트 디렉토리 만 마운트하기 때문에 다른 볼륨과 다릅니다. 파일은 표준 cp 명령을 사용하여 복사 할 수 있습니다.

또한 컬 (curl) W wget과 같이 명령 스택 (하나의 컨테이너에서 실행 됨)에서 실행될 수 있으며 이미지 크기를 곱하지 않습니다. ADD 및 COPY는 독립형 컨테이너에서 실행되고 추가 컨테이너에서 실행되는 파일에 대한 후속 명령이 이미지 크기를 곱하기 때문에 스택 가능하지 않습니다.

옵션을 다음과 같이 설정하십시오.

-v /opt/mysql-staging:/tvol

다음은 하나의 컨테이너에서 실행됩니다.

RUN cp -r /tvol/mysql-5.7.15-linux-glibc2.5-x86_64 /u1 && \
    mv /u1/mysql-5.7.15-linux-glibc2.5-x86_64 /u1/mysql && \

    mkdir /u1/mysql/mysql-files && \
    mkdir /u1/mysql/innodb && \
    mkdir /u1/mysql/innodb/libdata && \
    mkdir /u1/mysql/innodb/innologs && \
    mkdir /u1/mysql/tmp && \

    chmod 750 /u1/mysql/mysql-files && \
    chown -R mysql /u1/mysql && \
    chgrp -R mysql /u1/mysql




dockerfile