Docker làm thế nào để chỉ chạy tệp pip Request.txt nếu có thay đổi?


91

Trong Dockerfile, tôi có một lớp cài đặt requirements.txt:

FROM python:2.7
RUN pip install -r requirements.txt

Khi tôi xây dựng hình ảnh docker, nó sẽ chạy toàn bộ quá trình bất kể bất kỳ thay đổi nào được thực hiện đối với tệp này.

Làm cách nào để đảm bảo Docker chỉ chạy pip install -r requirements.txtnếu có thay đổi đối với tệp?

Removing intermediate container f98c845d0f05
Step 3 : RUN pip install -r requirements.txt
 ---> Running in 8ceb63abaef6
Collecting https://github.com/tomchristie/django-rest-framework/archive/master.zip (from -r requirements.txt (line 30))
  Downloading https://github.com/tomchristie/django-rest-framework/archive/master.zip
Collecting Django==1.8.7 (from -r requirements.txt (line 1))

1
Vui lòng đăng đầu ra của docker build(và của bạn Dockerfile). Có lẽ, đó là một bước trước đó trong quá trình xây dựng của bạn đang làm hỏng bộ nhớ cache, khiến bước này chạy.
Thomas Orozco

cập nhật OP với tất cả những gì tôi có vào lúc này
Prometheus

1
Chỉ là bước này không hữu ích. Vui lòng đăng đầu ra hoàn chỉnh (hoặc ít nhất là Dockerfile).
Thomas Orozco

Câu trả lời:


171

Tôi giả định rằng tại một số điểm trong quá trình xây dựng của bạn, bạn đang sao chép toàn bộ ứng dụng của mình vào hình ảnh Docker với COPYhoặc ADD:

COPY . /opt/app
WORKDIR /opt/app
RUN pip install -r requirements.txt

Vấn đề là bạn đang làm mất hiệu lực của bộ đệm ẩn bản dựng Docker mỗi khi bạn sao chép toàn bộ ứng dụng vào hình ảnh. Điều này cũng sẽ làm mất hiệu lực bộ đệm cho tất cả các bước xây dựng tiếp theo.

Để tránh điều này, tôi khuyên bạn chỉ nênrequirements.txt sao chép tệp trong một bước xây dựng riêng trước khi thêm toàn bộ ứng dụng vào hình ảnh:

COPY requirements.txt /opt/app/requirements.txt
WORKDIR /opt/app
RUN pip install -r requirements.txt
COPY . /opt/app
# continue as before...

Vì bản thân tệp yêu cầu có thể chỉ thay đổi hiếm khi, bạn sẽ có thể sử dụng các lớp được lưu trong bộ nhớ cache cho đến khi bạn thêm mã ứng dụng của mình vào hình ảnh.


8
Theo nguyên tắc chung, tôi tin rằng COPYnó được ưu tiên hơn ADDtrừ khi bạn cần cụ thể hành vi của ADD.
Metropolis

2
@Metropolis, bạn hoàn toàn chính xác. Cảm ơn vì gợi ý.
helmbert

5
Đồng ý với @Metropolis. ADDchỉ cần thiết nếu <src>thư mục đang chứa bất kỳ tệp lưu trữ nào cần được giải nén hoặc cần hỗ trợ xử lý URL từ xa. {source code}
Mohsin

44

Điều này được đề cập trực tiếp trong "Các phương pháp hay nhất để viết Dockerfiles " của riêng Docker :

Nếu bạn có nhiều bước Dockerfile sử dụng các tệp khác nhau từ ngữ cảnh của bạn, hãy SAO CHÉP chúng riêng lẻ, thay vì tất cả cùng một lúc. Điều này sẽ đảm bảo rằng bộ đệm ẩn xây dựng của mỗi bước chỉ bị vô hiệu (buộc phải chạy lại bước) nếu các tệp được yêu cầu cụ thể thay đổi.

Ví dụ:

COPY requirements.txt /tmp/
RUN pip install --requirement /tmp/requirements.txt
COPY . /tmp/

Dẫn đến ít hợp lệ bộ đệm hơn cho bước RUN, so với khi bạn đặt SAO CHÉP. / tmp / trước nó.


0

Ngoài ra, như một phương tiện nhanh hơn để chạy tệp tin request.txt mà không cần nhập "có" để xác nhận cài đặt thư viện, bạn có thể viết lại dưới dạng:

COPY requirements.txt ./
RUN pip install -y -r requirements.txt
COPY ./"dir"/* .
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.