매우 큰 도커 이미지에 대한 컨텍스트 빌드
Docker 파일을 정리하기 위해 Docker에 대해 배우려고 할 때 호스트 컴퓨터에 몇 가지 다른 디렉토리를 만들었습니다. 방금 실행 한 Dockerfile은 다음과 같습니다.
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 클라이언트는 전체 "빌드 컨텍스트"를 Docker 데몬으로 보냅니다. 해당 빌드 컨텍스트 (기본적으로)는있는 전체 디렉토리 Dockerfile
(즉, 전체 rpms
트리)입니다.
.dockerignore
Docker가 일부 파일을 무시 하도록 파일을 설정할 수 있습니다 . 실험 해 볼 수 있습니다.
또는, 당신은 당신의 이동할 수 있습니다 rpms
당신의 위의 폴더 하나의 디렉토리 레벨을 Dockerfile
, 그리고 심볼릭 링크 만 test.rpm
로 Dockerfile
의 디렉토리.
많은 사용자가 의견에서 지적했듯이, 제 경우에는 150MB-> 5GB 차이의 원인이었던 폴더를 추가해야 .git
합니다.dockerignore
.
2019 업데이트
Docker v18.06부터 Build Kit 라는 새 이미지 빌더를 사용하는 옵션이 있습니다 .
Docker와 함께 미리 번들로 제공되며 아무것도 설치할 필요가 없습니다. Dockerfile
구문 과 역 호환되며 Dockerfile
.
레거시 Docker 빌드 대 새 Docker BuildKit
다음은 빌드 디렉토리에 사용되지 않은 대용량 파일로 이미지를 빌드하는 예입니다.
레거시 Docker 빌드 :
$ 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
새로운 Docker BuildKit :
$ 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에 의해 "빌드 컨텍스트"로 복사되지 않습니다.
Dockerfile과 docker-compose.yml을 하위 폴더로 이동하여 문제를 해결했으며 훌륭하게 작동했습니다. 분명히 docker는 현재 폴더를 데몬으로 보내고 내 폴더는 9 기가였습니다.
당신이있는 경우 .dockerignore
파일 및 빌드 환경은 여전히 큰, 당신은 사용하여 고정 표시기 빌드 컨텍스트에 전송되는 것을 확인할 수 있습니다 실버 수색자를 :
ag --path-to-ignore .dockerignore --files-with-matches
Note that some **
patterns might not work properly.
See this Github issue for additional comments: https://github.com/moby/moby/issues/16056
In my case that was when i execute with wrong -f
arguments - without path to directory where located Dockerfile
docker build --no-cache -t nginx5 -f /home/DF/Dockerfile /home/DF/
- right
docker build --no-cache -t nginx5 -f /home/DF/Dockerfile
- wrong
I had the same issue as FreeStyler. However I was building from a directory one up from my context. So the -f arguments were correct the context was incorrect.
project
|
-------docker-dir
Building from the docker-dir the following was fine
docker build -t br_base:0.1 .
Building from the dock-dir the the build context changed. Therefore I needed to change the context in the command. Context is given by the '.' in the command above.
The the new command from the project directory should be
docker build -t br_base:0.1 ./base
Context here is given by the './base'
If you want to be in full control of your build context you could also build the container completely without any context and COPY
relevant data into the container afterwards.
docker build - < Dockerfile
One downside of this would be that with this approach you can only ADD
things in the dockerfile referencing to a remote URL, and not files from your local host.
See https://docs.docker.com/engine/reference/commandline/build/#build-with--
참고URL : https://stackoverflow.com/questions/26600769/build-context-for-docker-image-very-large
'programing' 카테고리의 다른 글
dmesg 타임 스탬프를 사용자 지정 날짜 형식으로 변환 (0) | 2020.08.20 |
---|---|
C에 "foreach"루프 구조가 있습니까? (0) | 2020.08.20 |
PHP $ array [] = $ value 또는 array_push ($ array, $ value)에서 사용하는 것이 더 낫습니까? (0) | 2020.08.20 |
복사와 복제의 차이점은 무엇입니까? (0) | 2020.08.19 |
스칼라 유형 프로그래밍 리소스 (0) | 2020.08.19 |