도커 이미지에 대한 빌드 컨텍스트 매우 큼
도커 파일을 정리하기 위해 도커에 대해 배우려고 호스트 시스템에 몇 가지 다른 디렉토리를 만들었습니다.방금 실행한 도커 파일은 다음과 같습니다.
FROM crystal/centos
MAINTAINER crystal
ADD ./rpms/test.rpm ./rpms/
RUN yum -y --nogpgcheck localinstall /rpms/test.rpm
내 실제 rpm은 1GB에 불과합니다. 내가 할 는.sudo docker build -t="crystal/test" .
빌드 컨텍스트를 Docker 데몬 3.5GB로 보냅니다.당신이 도커 이미지를 계속 빌드할 때 제가 모르는 것이 또 있습니까?호스트 시스템의 다른 디렉토리에 더 많은 이미지를 구축하면 메모리가 축적됩니까?
Docker 클라이언트는 전체 "빌드 컨텍스트"를 Docker 데몬으로 보냅니다. 컨텍스트는 전체 입니다.Dockerfile
있음 ( 에따있음서전라체, )따체▁isrpms
Docker가 일부 파일을 무시하도록 파일을 설정할 수 있습니다.당신은 그것을 실험해 보는 것이 좋을 것입니다.
▁your를 움직일 수 .rpms
폴더 하나의 디렉토리 레벨 위에Dockerfile
그리고 심볼릭 링크만.test.rpm
Dockerfile
의 디렉토리.
여기 설명에 있는 일부 사용자의 경우 150MB -> 5GB 차이의 원인이 된 폴더를 에 추가하는 경우가 많습니다.
2019년 업데이트
Docker v18.06부터는 Build Kit라는 새로운 이미지 작성기를 사용할 수 있는 옵션이 제공됩니다.
도커와 함께 사전 번들로 제공되므로 아무것도 설치할 필요가 없습니다.이전 버전과 호환됩니다.Dockerfile
, 변할필을 변경할 가 없습니다.Dockerfile
.
기존 도커 빌드와 새 도커 빌드 키트 비교
다음은 빌드 디렉터리에 사용되지 않는 대용량 파일을 사용하여 이미지를 빌드하는 예입니다.
레거시 도커 빌드:
$ time docker image build --no-cache .
Sending build context to Docker daemon 4.315GB
[...]
Successfully built c9ec5d33e12e
real 0m51.035s
user 0m7.189s
sys 0m10.712s
새 도커 빌드 키트:
$ time DOCKER_BUILDKIT=1 docker image build --no-cache .
[+] Building 0.1s (5/5) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 37B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
[...]
=> => writing image sha256:ba5bca3a525ac97573b2e1d3cb936ad50cf8129eedfa9 0.0s
real 0m0.166s
user 0m0.034s
sys 0m0.026s
은 유한변는입니다.DOCKER_BUILDKIT=1
환경 변수, 시간의 차이가 큽니다.
.dockerignore
참로고, 다은음은.dockerignore
파일은 여전히 유효하고 유용합니다. ㅠㅠDockerfile
과 같은 명령COPY . .
해서 여히고것다니입할려전을 할 것입니다..dockerignore
디렉터리에 파일(""에서 참조되지 ). 그러나 빌드 디렉토리의 사이드 파일(에서 참조되지 않음)Dockerfile
더 BuildKit에 컨텍스트는 더 이상 빌드 키트에 의해 "빌드 컨텍스트"로 복사되지 않습니다.
Docker 파일과 docker-compose.yml을 하위 폴더로 이동하여 수정했는데 잘 작동했습니다.도커가 현재 폴더를 데몬으로 보내고 내 폴더는 9기가였습니다.
만약 당신이 가지고 있다면..dockerignore
파일 및 빌드 컨텍스트가 여전히 크므로 Silver Searcher를 사용하여 도커 빌드 컨텍스트로 전송되는 내용을 확인할 수 있습니다.
ag --path-to-ignore .dockerignore --files-with-matches
로 어떤 것은**
패턴이 제대로 작동하지 않을 수 있습니다.
추가 의견은 이 Github 호를 참조하십시오. https://github.com/moby/moby/issues/16056
한 문제로 인해 하는 큰 입니다..dockerignore
제외는 다음 명령을 사용합니다.
rg -uuu --ignore-file .dockerignore --files --sort path .
이 도구를 사용하는 도구: https://github.com/BurntSushi/ripgrep
정말 잘 작동합니다.
경우는 입니다.-f
- 없음 - Docker 파일 이름 - Docker 파일 이름
docker build --no-cache -t nginx5 -f /home/DF/Dockerfile /home/DF/
오른쪽의
docker build --no-cache -t nginx5 -f /home/DF/Dockerfile
위해서NodeJS Application
a를 추가합니다..dockerignore
와 파일을 로 정리하고 루트프내파일부및리디렉 합니다..dockerignore
의 파일을 합니다.
node_modules
dist
빌드할 .COPY
관련 데이터를 컨테이너에 저장합니다.
docker build - < Dockerfile
이것의 한 가지 단점은 이 접근법을 통해서만 할 수 있다는 것입니다.ADD
로컬 호스트의 파일이 아닌 원격 URL을 참조하는 도커 파일의 항목.
https://docs.docker.com/engine/reference/commandline/build/ #build-with--를 참조하십시오.
도커 이미지 빌드 컨텍스트가 너무 클 경우 수행할 수 있는 작업을 요약하면 다음과 같습니다.
- 컨텍스트에 사용되지 않는 파일(이미지 구축 중에도 여전히 터치할 수 없는 파일)이 없는지 확인합니다.
- 사용하지 않는 파일 및/또는 디렉토리를 .vmserignore에 추가합니다(여기에 언급됨).
- 올바른 폴더를 이미지 빌드 컨텍스트로 지정해야 합니다(여기서 언급한 대로).
- DOKER_B와 함께 BuildKit 사용 시도UILDKIT=1(여기에 언급됨);
- 프로젝트를 더 작은 부분으로 분할하여 빌드 컨텍스트의 콘텐츠를 최적화합니다.
- 복잡한 프로젝트가 있는 경우 빌드하기 전에 필요한 모든 파일을 개별 폴더에 수동으로 수집하여 특정 이미지의 빌드 컨텍스트로 사용할 수 있습니다.
는 빌된도이를미검는훌같다다습니과입니다.dive
https://github.com/wagoodman/://github.com/wagoodman/dive
다음은 공식 독본의 지침입니다.
도커 이미지를 분석하려면 이미지 태그/ID/다이제스트를 사용하여 다이브를 실행합니다.
dive <your-image-tag>
또는 이미지를 빌드하려는 경우 바로 분석에 들어갑니다.
dive build -t <some-tag> .
이미지를 만들고 복사하는 데 로그 시간이 걸리는 도커 데몬으로 빌드 컨텍스트를 보내는 메시지를 받는 경우,
그런 다음 .vmserignore 파일을 추가합니다.복사할 필요가 없는 파일 또는 디렉터리를 포함해야 합니다.
저는 FreeStyler와 같은 문제가 있었습니다.하지만 저는 제 맥락에서 하나씩 디렉토리를 구축하고 있었습니다.따라서 -f 인수는 정확했습니다. 문맥이 정확하지 않았습니다.
project
|
-------docker-dir
부두에서 건물을 짓는 것은 다음과 같았습니다.
docker build -t br_base:0.1 .
선착장에서 빌드하는 동안 빌드 컨텍스트가 변경되었습니다.따라서 명령어의 컨텍스트를 변경해야 했습니다.컨텍스트는 위 명령의 '.'에 의해 제공됩니다.
프로젝트 디렉토리의 새 명령은 다음과 같아야 합니다.
docker build -t br_base:0.1 ./base
여기서 컨텍스트는 '//base'에 의해 제공됩니다.
언급URL : https://stackoverflow.com/questions/26600769/build-context-for-docker-image-very-large
'programing' 카테고리의 다른 글
라우터 getCurrentNavigation은 항상 null을 반환합니다. (0) | 2023.08.15 |
---|---|
Swift에서 배열의 마지막 요소를 가져오려면 어떻게 해야 합니까? (0) | 2023.08.15 |
도커 구성에서 포트와 노출의 차이점은 무엇입니까? (0) | 2023.08.15 |
K&R 책에서 malloc의 이 구현에 대해 설명합니다. (0) | 2023.08.15 |
.git 디렉터리 웹에 액세스할 수 없도록 설정 (0) | 2023.08.15 |