programing

매우 큰 도커 이미지에 대한 컨텍스트 빌드

nasanasas 2020. 8. 20. 18:56
반응형

매우 큰 도커 이미지에 대한 컨텍스트 빌드


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트리)입니다.

.dockerignoreDocker가 일부 파일을 무시 하도록 파일을 설정할 수 있습니다 . 실험 해 볼 수 있습니다.

또는, 당신은 당신의 이동할 수 있습니다 rpms당신의 위의 폴더 하나의 디렉토리 레벨을 Dockerfile, 그리고 심볼릭 링크 만 test.rpmDockerfile의 디렉토리.


많은 사용자가 의견에서 지적했듯이, 제 경우에는 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

반응형