Làm cách nào để xây dựng môi trường Linux chỉ định các phiên bản cụ thể của gói?


9

Tôi đang tạo một dockerfile chạy một ứng dụng tùy chỉnh được gắn với một phiên bản cụ thể của Java.

Tôi đang sử dụng một hình ảnh cơ sở centos7 bởi vì đó là những gì một bài viết mà tôi đang đề cập đến đang sử dụng và bởi vì tôi phải sử dụng một cái gì đó, vì vậy nó cũng tốt như bất kỳ. Tôi thực sự không quan tâm đến những gì người dùng tôi đang sử dụng. Điểm của hình ảnh này là phần mềm đang được lưu trữ, bản phân phối Linux chỉ là phương tiện để kết thúc - quan trọng là, JDK sẽ không được sử dụng bởi các ứng dụng hoặc người dùng khác.

Như đã nêu, ứng dụng của tôi được gắn với phiên bản Java cụ thể mà tôi đang sử dụng - mọi bản cập nhật cho phiên bản Java sẽ yêu cầu kiểm tra hồi quy đầy đủ của phần mềm với phiên bản cụ thể đó trước khi phát hành.

Bài viết mà tôi đang theo dõi bắt đầu với các phần cài đặt JDK của dockerfile có liên quan trông như thế này:

FROM centos:centos7
RUN yum makecache \
    && yum update -y \
    && yum install -y \
    java-1.8.0-openjdk-devel \
    && yum clean all

Điều đó không đủ cụ thể, bất cứ khi nào hình ảnh được xây dựng, nó sẽ có một phiên bản Java ngẫu nhiên, đó không phải là điều tôi muốn, tôi cần một phiên bản Java cụ thể.

Tôi đã thay đổi tập tin docker để trông như thế này:

FROM centos:centos7
RUN yum makecache \
    && yum update -y \
    && yum install -y \
    java-1.8.0-openjdk-devel-1.8.0.65-3.b17.el7 \
    && yum clean all

Và hình ảnh docker đã được xây dựng tốt. Đó là vào tháng 12.

Tuần này, tôi cần thực hiện một thay đổi nhỏ cho một phần khác của phần mềm và xây dựng lại một phiên bản mới của hình ảnh, nhưng việc xây dựng hình ảnh bây giờ thất bại.

Bản dựng hiện không thành công vì phiên bản cụ thể của gói java không còn khả dụng (ít nhất, tôi nghĩ đó là những gì nó nói với tôi):

Error: Package: 1:java-1.8.0-openjdk-1.8.0.65-3.b17.el7.x86_64 (base)
Requires: java-1.8.0-openjdk-headless = 1:1.8.0.65-3.b17.el7
Available: 1:java-1.8.0-openjdk-headless-1.8.0.65-3.b17.el7.x86_64 (base)
java-1.8.0-openjdk-headless = 1:1.8.0.65-3.b17.el7
Installing: 1:java-1.8.0-openjdk-headless-1.8.0.71-2.b15.el7_2.x86_64 (updates)
java-1.8.0-openjdk-headless = 1:1.8.0.71-2.b15.el7_2

Làm cách nào tôi có thể xây dựng lại dockerfile của mình để tôi luôn có thể sử dụng một phiên bản Java cụ thể (trong ví dụ này, tôi muốn phiên bản java là bản cập nhật 1.8.0 65)?

Một câu trả lời tiêu cực là tốt - nếu nói chung các cơ chế đóng gói Linux khác nhau không muốn mọi người sử dụng kho lưu trữ của họ như thế này, thì đó là - Tôi luôn có thể đóng gói phiên bản JDK của riêng mình dưới dạng tệp zip và chỉ giải nén ở đâu đó bên trong môi trường như là một phần của quá trình xây dựng hình ảnh, nhưng đó là một loạt rắc rối mà tôi không muốn phải làm.

Làm thế nào để người khác làm điều này? Có cách cài đặt JDK khác nhau để tôi có thể có phiên bản phân phối HĐH gần đây với các bản cập nhật mới nhất (như được định nghĩa bởi hình ảnh cơ bản trong mệnh đề TỪ và bản cập nhật yum) nhưng cài đặt một phiên bản cụ thể của JDK không?

Có phiên bản Linux nào phù hợp hơn với loại yêu cầu này không (tôi không kết hợp với CentOS, bản phân phối Linux của người dùng không đặc biệt quan trọng đối với tôi)?


Sẽ yum-versionlock bởi có thể sử dụng với Docker?
Aaron Copley

1
@AaronCopley Tôi không nghĩ vậy. versionlock dường như tập trung vào việc đảm bảo phiên bản vẫn ở đó là lần tiếp theo bạn chạy cập nhật - nhưng tôi thực sự lo lắng về việc làm cho lệnh cài đặt ban đầu không bị lỗi khi kho lưu trữ đã chuyển sang phiên bản mới. Tôi không có kế hoạch chạy cập nhật yum trên môi trường cụ thể đó một lần nữa. Khi môi trường cần cập nhật mới, một hình ảnh docker mới sẽ được xây dựng (và tôi muốn hình ảnh đó được sử dụng cùng một phiên bản chính xác của JDK như hiện tại nó đang sử dụng).
Shorn

1
Xin lỗi, tôi nghĩ rằng tôi đã hiểu lầm. Bạn có thể thấy phiên bản bạn yêu cầu là cơ sở và nó cài đặt từ các bản cập nhật vì bất kỳ lý do gì. Hãy thửyum install -y $package --disablerepo=updates
Aaron Copley

1
@AaronCopley Yep, điều đó dường như hoạt động - cảm ơn! Nếu bạn làm cho nó một câu trả lời tôi sẽ đánh dấu nó thành công. Hoặc tôi sẽ thêm nó sau.
Shorn

Câu trả lời:


2

Có vẻ như nó thấy gói bạn muốn, nhưng vì bất kỳ lý do gì được cài đặt từ kho cập nhật.

Bạn có thể vô hiệu hóa kho lưu trữ cập nhật trong lệnh yum của bạn;

yum install -y $package --disablerepo=updates
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.