docker 이미지의 컨텍스트를 매우 크게 빌드


142

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 이미지를 계속 빌드 할 때 알지 못하는 것이 있습니까? 호스트 시스템의 다른 디렉토리에 더 많은 이미지를 빌드 할 때 메모리가 누적됩니까?


2
빌드 컨텍스트는 현재 디렉토리의 모든 파일 / 디렉토리입니다.
Nabin

이 디렉토리에는 빌드에 필요한 파일 만 보관하십시오. 즉, Dockerfile 및 Dockerfile의 빌드 이미지에 복사 / 추가 된 모든 로컬 파일 / 디렉토리입니다. 또한.dockerignore
Vishrant

답변:


266

Docker 클라이언트는 전체 "빌드 컨텍스트"를 Docker 데몬으로 보냅니다. 해당 빌드 컨텍스트 (기본적으로)는 전체 디렉토리 Dockerfile(전체 rpms트리)입니다.

.dockerignoreDocker가 일부 파일을 무시 하도록 파일을 설정할 수 있습니다 . 당신은 그것을 실험하고 싶을 수도 있습니다.

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


많은 사용자가 의견에서 지적했듯이 내 경우에는 150MB-> 5GB 차이의 원인이되는 폴더를 폴더에 추가해야 .git합니다.dockerignore .


4
불행히도이 경우 ADD명령이 빌드 중에 sym 링크를 따르지 않기 때문에 symlinking이 불가능한 것 같습니다 . 참조 : github.com/docker/docker/issues/1676
JimmidyJoo

5
생명의 은인! 개발자 레일 : 확실히 추가 할 수 tmp log.dockerignore+ 기타 사용자 정의 것들
equivalent8을

7
.doc 폴더를 .dockerignore 파일에 추가하는 것을 잊지 마십시오 (git을 사용한다고 가정)
dsncode

8
네, .git폴더가 기본적으로 포함되어 있습니다 -이 확실히 나를 붙 잡았다.
Paul Suart

1
"빌드 컨텍스트"는 정확히 무엇입니까? docker build RUN 명령을 사용하여 이러한 파일을 찾으려고했지만 도커 파일 시스템 내의 Dockerfile 폴더에있는 파일을 볼 수 없습니다 (빌드 시간 동안) 누군가 빌드 컨텍스트가 어떻게 유용한 지 간단한 예를 들어 줄 수 있습니까?
Patrick

52

2019 업데이트

Docker v18.06부터 Build Kit 라는 새로운 이미지 빌더를 사용하는 옵션이 있습니다 .

Docker와 함께 번들로 제공되므로 아무것도 설치할 필요가 없습니다. Dockerfile구문 과 호환 되므로를 변경할 필요가 없습니다 Dockerfile.

레거시 도커 빌드 및 새로운 도커 BuildKit

다음은 빌드 디렉토리에서 사용되지 않은 거대한 파일로 이미지를 작성하는 예입니다.

레거시 도커 빌드 :

$ 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에 의해 "빌드 컨텍스트"로 복사되지 않습니다.


1
DOCKER_BUILDKIT는 현재 Windows 컨테이너에서 지원되지 않습니다. (Linux 만 해당, 제한 사항에 따라 나열 됨 : docs.docker.com/develop/develop-images/build_enhancements )
Vaccano

18

Dockerfile과 docker-compose.yml을 하위 폴더로 이동하여 문제를 해결했으며 훌륭하게 작동했습니다. 분명히 docker는 현재 폴더를 데몬으로 보내고 내 폴더는 9 기가였습니다.


4
이 방법은 금지 된 경로를 제공합니다 : 상위 디렉토리의 파일을 복사하는 경우 빌드 컨텍스트 외부 오류입니다.
Kitwradr 2016 년

8

당신이있는 경우 .dockerignore파일 및 빌드 환경은 여전히 큰, 당신은 사용하여 고정 표시기 빌드 컨텍스트에 전송되는 것을 확인할 수 있습니다 실버 수색자를 :

ag --path-to-ignore .dockerignore --files-with-matches

일부 **패턴이 제대로 작동하지 않을 수 있습니다.

추가 의견은 다음 Github 문제를 참조하십시오. https://github.com/moby/moby/issues/16056


4

내 경우에는 내가 잘못 실행했을 때였 다. -f 인수로 때였습니다-Dockerfile이있는 디렉토리 경로 없음

docker build --no-cache -t nginx5 -f /home/DF/Dockerfile /home/DF/ - 권리

docker build --no-cache -t nginx5 -f /home/DF/Dockerfile - 잘못된



0

FreeStyler와 같은 문제가있었습니다. 그러나 나는 내 맥락에서 디렉토리 하나를 구축하고있었습니다. 따라서 -f 인수가 정확하고 컨텍스트가 올바르지 않습니다.

project 
|
-------docker-dir 

docker-dir에서 빌드하면 다음이 좋습니다.

docker build -t br_base:0.1 . 

dock-dir에서 빌드 컨텍스트가 변경되었습니다. 따라서 명령에서 컨텍스트를 변경해야했습니다. 문맥은 '.' 위의 명령에서.

프로젝트 디렉토리의 새로운 명령은

docker build -t br_base:0.1 ./base

여기서 컨텍스트는 './base'에 의해 제공됩니다.


0

이미지를 생성 하고 복사하는 데 로그 시간이 걸리는 docker 데몬에 빌드 컨텍스트를 보내는 메시지 얻는 경우 ,

그런 다음 .dockerignore 파일 을 추가 하십시오 . 복사 할 필요가없는 파일이나 디렉토리를 포함해야합니다.


0

들어 NodeJS Application하는 추가 .dockerignore파일을 루트 프로젝트 디렉토리를하고, 내부 .dockerignore파일에 다음을 추가

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