Dockerfile을 사용하여 한 레이어에 여러 파일을 복사하는 방법은 무엇입니까?


246

다음 Dockerfile은 4 개의 COPY레이어로 구성됩니다.

COPY README.md ./
COPY package.json ./
COPY gulpfile.js ./
COPY __BUILD_NUMBER ./

대신 하나의 레이어를 사용하여 이러한 파일을 복사하는 방법은 무엇입니까? 다음이 시도되었습니다.

COPY [
    "__BUILD_NUMBER ./",
    "README.md ./",
    "gulpfile ./",
    "another_file ./",
]

답변:


427
COPY README.md package.json gulpfile.js __BUILD_NUMBER ./

또는

COPY ["__BUILD_NUMBER", "README.md", "gulpfile", "another_file", "./"]

소스 파일 스펙에서 와일드 카드 문자를 사용할 수도 있습니다. 좀 더 자세한 내용은 문서를 참조하십시오 .

디렉토리는 특별하다! 당신이 쓰는 경우

COPY dir1 dir2 ./

실제로 작동합니다

COPY dir1/* dir2/* ./

단일 명령으로 대상 디렉토리 아래에 여러 디렉토리 (그 내용이 아닌)를 복사하려면 소스 디렉토리가 공통 상위에 있고 그 상위에 있도록 빌드 컨텍스트를 설정해야합니다 COPY.


53
소스가 디렉토리 인 경우 디렉토리 자체가 아니라 디렉토리 내용을 복사합니다 .
Claudiu

7
또한 대상 디렉토리는 동일합니다. 대상이 다른 여러 파일을 많이 사용하는 경우 chroot와 같은 오버레이 파일 시스템을 구성한 다음이를 tar아카이브로 설정하고 ADD로 추가하는 것이 좋습니다.
tu-Reinstate Monica-dor duh

4
@Claudiu 폴더 자체를 복사하는 방법?
k0pernikus

5
@ k0pernikus 당신은 말할 수 있습니다 복사 myDir1 ./MyDir1/
Manuel Manhart

@ manuel-manhart 빌드 파라미터를 사용하여 파일 목록을 파라미터화할 수 있는지 아는 사람이 있습니까? github.com/moby/moby/issues/38532 ?
Marcello de Sales

52
COPY <all> <the> <things> <last-arg-is-destination>

그러나 여기 문서에서 발췌 한 중요한 내용이 있습니다.

컨텍스트와 다른 파일을 사용하는 여러 Dockerfile 단계가있는 경우 한 번에 하나씩이 아니라 개별적으로 복사하십시오. 이렇게하면 특별히 필요한 파일이 변경 될 경우 각 단계의 빌드 캐시가 무효화됩니다 (단계를 다시 실행해야 함).

https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#add-or-copy


"모든 것"을 매개 변수화 할 수 있는지 아십니까? 빌드 매개 변수를 사용하십니까? github.com/moby/moby/issues/38532 ???
Marcello de Sales

@MarcellodeSales 왜 필요한지 잘 모르겠습니다. 이러한 파일없이 기본 이미지를 만든 다음 하위 이미지에 복사 명령이있는 이유는 무엇입니까? 어쨌든 경로를 정의 해야하는 경우 큰 차이가 없습니다. 또는 이미지를 완전히 남겨두고 컨테이너에 마운트하면 .env 파일을 통해 구성 할 수 있습니다.
Manuel Manhart

또한 어쨌든 기존 경로를 항상 복사 할 수 있습니다. 파일 시스템은 계층화되어 있기 때문에 기존 컨텐츠와 겹치거나 음영 처리됩니다.
Manuel Manhart

@ManuelManhart, ONBUILD COPY를 사용하여 동적 매개 변수화 된 이미지를 구축하고 있습니다 ... 플랫폼의 일부로서 이미지에서 수행해야하는 작업의 복잡성을 숨기고 있습니다. 따라서 값을 제공해야합니다. 매개 변수로.
Marcello de Sales

@MarcellodeSales 나는 이것이 현재 / 아직 지원되지 않는다고 생각합니다. 그러나 빌드 인수를 사용하여 캡슐화 할 수 있습니다. stackoverflow.com/questions/43654656/…
Manuel Manhart

7

단순한

COPY README.md  package.json gulpfile.js __BUILD_NUMBER ./

의사 로부터

직접 또는 와일드 카드 사용으로 인해 여러 자원이 지정된 경우 디렉토리 여야하며 슬래시 (/)로 끝나야합니다.


6

.dockerignore파일을 만들거나 제외 하지 않은 파일을 제외시킬 수도 있습니다.복사 않으려 .

https://docs.docker.com/engine/reference/builder/#dockerignore-file

docker CLI가 컨텍스트를 docker 데몬으로 보내기 전에 컨텍스트의 루트 디렉토리에서 .dockerignore라는 파일을 찾습니다. 이 파일이 존재하면 CLI는 파일과 일치하는 파일 및 디렉토리를 제외하도록 컨텍스트를 수정합니다. 이를 통해 불필요하게 크거나 민감한 파일과 디렉토리를 데몬에 전송하고 ADD 또는 COPY를 사용하여 이미지에 추가 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.