xây dựng bối cảnh cho hình ảnh docker rất lớn


140

Tôi đã tạo một vài thư mục khác nhau trên máy chủ của mình khi tôi cố gắng tìm hiểu về Docker chỉ để giữ cho các dockerfiles của mình được tổ chức. Dockerfile của tôi Tôi vừa chạy trông như thế này:

FROM crystal/centos
MAINTAINER crystal

ADD ./rpms/test.rpm ./rpms/ 
RUN yum -y --nogpgcheck localinstall /rpms/test.rpm 

Vòng quay thực tế của tôi chỉ là 1 GB. Nhưng khi tôi cố gắng thực hiện sudo docker build -t="crystal/test" ., tôi nhận được việc gửi bối cảnh xây dựng tới Docker daemon 3,5 GB. Có điều gì khác mà tôi không biết khi bạn tiếp tục xây dựng hình ảnh Docker không? Bộ nhớ của tôi có tích lũy khi tôi xây dựng thêm hình ảnh trong các thư mục khác trên máy chủ của mình không?


2
Ngữ cảnh xây dựng là tất cả các tệp / thư mục trong thư mục hiện tại.
Nabin

Chỉ giữ các tệp bạn cần cho bản dựng trong thư mục này. Đó là, Dockerfile và bất kỳ tệp / thư mục cục bộ nào được sao chép / thêm vào hình ảnh bản dựng trong Dockerfile. Ngoài ra, hãy sử dụng.dockerignore
Vishrant

Câu trả lời:


264

Máy khách Docker gửi toàn bộ "bối cảnh xây dựng" đến daemon Docker. Bối cảnh xây dựng đó (theo mặc định) là toàn bộ thư mục Dockerfilenằm trong (vì vậy, toàn bộ rpmscây).

Bạn có thể thiết lập một .dockerignoretệp để lấy Docker để bỏ qua một số tệp. Bạn có thể muốn thử nghiệm với nó.

Ngoài ra, bạn có thể di chuyển rpmsthư mục của mình một cấp thư mục lên trên Dockerfilevà chỉ liên kết tượng trưng test.rpmvào Dockerfilethư mục của.


Như nhiều người dùng đã chỉ ra trong các bình luận, một người cần thêm .gitthư mục vào.dockerignore đó là nguyên nhân của sự khác biệt 150MB -> 5GB trong trường hợp của tôi.


4
Thật không may, dường như không thể ADDliên kết symlink trong trường hợp này vì lệnh không tuân theo các liên kết sym trong quá trình xây dựng. Xem: github.com/docker/docker/issues/1676
JimmidyJoo

5
phao cứu sinh! Nhà phát triển Rails: đảm bảo thêm tmp logvào .dockerignore+ các tùy chỉnh khác
tương

7
đừng quên thêm thư mục .git vào tệp .dockerignore (giả sử bạn đang sử dụng git)
dsncode

8
Đúng, .gitthư mục được bao gồm theo mặc định - điều này chắc chắn khiến tôi bị loại.
Paul Suart

1
"Xây dựng bối cảnh" chính xác là gì? Tôi đã cố gắng tìm kiếm các tệp này bằng lệnh RUN builder, nhưng tôi không thấy các tệp trong thư mục Dockerfile của mình bên trong hệ thống tệp docker (trong thời gian xây dựng.) Ai đó có thể cho tôi một ví dụ đơn giản về cách xây dựng bối cảnh hữu ích không?
Patrick

52

Cập nhật 2019

Bắt đầu từ Docker v18.06, có một tùy chọn để sử dụng trình tạo hình ảnh mới có tên Build Kit .

Nó được đóng gói sẵn với Docker, không cần cài đặt gì cả. Nó tương thích ngược với Dockerfilecú pháp, không cần thay đổi Dockerfile.

Di sản Docker Build vs New Docker BuildKit

Dưới đây là một ví dụ về việc xây dựng một hình ảnh với một tệp không sử dụng rất lớn trong thư mục xây dựng:

Xây dựng Docker kế thừa:

$ 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

BuildKit Docker mới:

$ 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

Thay đổi duy nhất là DOCKER_BUILDKIT=1biến môi trường, sự khác biệt về thời gian là rất lớn.

.dockerignore Tập tin

Xin lưu ý rằng các .dockerignoretập tin vẫn còn hiệu lực và hữu ích. Một số Dockerfilelệnh như COPY . .vẫn sẽ tính đến các .dockerignorequy tắc. Nhưng các tệp bên trong thư mục bản dựng (không được tham chiếu trong Dockerfile) sẽ không được sao chép nữa dưới dạng "bối cảnh xây dựng" của BuildKit.


1
Điều quan trọng cần lưu ý là DOCKER_BUILDKIT hiện không được hỗ trợ cho Windows Container. (Chỉ dành cho Linux, được liệt kê dưới các giới hạn: docs.docker.com/develop/develop-images/build_enhancements )
Vaccano

17

Tôi đã sửa nó bằng cách di chuyển Dockerfile và docker-compose.yml của tôi vào thư mục con và nó hoạt động rất tốt. Rõ ràng docker gửi thư mục hiện tại đến daemon và thư mục của tôi là 9 hợp đồng biểu diễn.


4
Phương pháp này đưa ra đường dẫn Cấm: bên ngoài lỗi bối cảnh xây dựng nếu một tệp từ thư mục mẹ đang được sao chép, giải pháp nào cho việc này?
Kitwradr

8

Nếu bạn có một .dockerignoretệp và bối cảnh xây dựng vẫn còn lớn, bạn có thể kiểm tra những gì đang được gửi đến bối cảnh xây dựng docker bằng Trình tìm kiếm bạc :

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

Lưu ý rằng một số **mẫu có thể không hoạt động đúng.

Xem vấn đề Github này để nhận xét bổ sung: https://github.com/moby/moby/issues/16056


4

Trong trường hợp của tôi đó là khi tôi thực thi với các -fđối số sai - không có đường dẫn đến thư mục nơi Dockerfile nằm

docker build --no-cache -t nginx5 -f /home/DF/Dockerfile /home/DF/ - đúng

docker build --no-cache -t nginx5 -f /home/DF/Dockerfile - Sai lầm


1

Nếu bạn muốn kiểm soát hoàn toàn bối cảnh xây dựng của mình, bạn cũng có thể xây dựng vùng chứa hoàn toàn mà không có bất kỳ bối cảnh và COPYdữ liệu liên quan nào vào vùng chứa sau đó.

docker build - < Dockerfile

Một nhược điểm của điều này là với cách tiếp cận này, bạn chỉ có thể ADDnhững thứ trong dockerfile tham chiếu đến một URL từ xa chứ không phải các tệp từ máy chủ lưu trữ cục bộ của bạn.

Xem https://docs.docker.com/engine/reference/commandline/build/#build-with--


0

Tôi đã có vấn đề tương tự như FreeStyler. Tuy nhiên tôi đã xây dựng từ một thư mục lên từ bối cảnh của tôi. Vì vậy, các đối số -f đã đúng bối cảnh không chính xác.

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

Xây dựng từ docker-dir sau đây là tốt

docker build -t br_base:0.1 . 

Xây dựng từ dock-dir bối cảnh xây dựng đã thay đổi. Vì vậy, tôi cần phải thay đổi bối cảnh trong lệnh. Bối cảnh được đưa ra bởi '.' trong lệnh trên.

Lệnh mới từ thư mục dự án phải là

docker build -t br_base:0.1 ./base

Bối cảnh ở đây được đưa ra bởi './base'


0

nếu bạn đang tạo hình ảnh và nhận thông điệp gửi bối cảnh xây dựng đến docker daemon đang mất thời gian đăng nhập để sao chép,

sau đó thêm tệp .dockerignore . nó nên bao gồm các tập tin hoặc thư mục không cần phải sao chép.


0

Đối với NodeJS Application, thêm một .dockerignoretệp thư mục dự án gốc của bạn và bên trong .dockerignoretệp thêm vào sau đây

node_modules
dist
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.