Как создать среду Linux, в которой указаны конкретные версии пакетов?

9

Я создаю dockerfile, который запускает пользовательское приложение, привязанное к определенной версии Java.

Я использую базовое изображение centos7, потому что именно эту статью я имел в виду, и потому что мне нужно что-то использовать, так что это так же хорошо, как и любое другое. Мне, честно говоря, все равно, какой пользовательский язык я использую. Смысл этого образа - размещение программного обеспечения, сам дистрибутив Linux - всего лишь средство для достижения цели - важно, что JDK не будет использоваться другими приложениями или пользователями.

Как уже говорилось, мое приложение связано с конкретной версией Java, которую я использую - любое обновление до версии Java потребует полного регрессионного тестирования программного обеспечения с этой конкретной версией до его выпуска.

Статья, за которой я следил, началась с соответствующих частей установки JDK dockerfile, которые выглядят так:

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

Это недостаточно конкретно, каждый раз, когда образы создаются, они получают случайную версию Java, а это не то, чего я хочу, мне нужна конкретная версия Java.

Я изменил файл Docker, чтобы он выглядел так:

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

И изображение докера строилось нормально. Это было в декабре.

На этой неделе мне нужно было внести небольшие изменения в другую часть программного обеспечения и пересобрать новую версию образа, но теперь сборка образа не удалась.

Сборка завершается ошибкой, потому что эта конкретная версия java-пакета больше недоступна (по крайней мере, я думаю, это то, что она говорит мне)

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

Как я могу перестроить свой dockerfile, чтобы я всегда мог использовать определенную версию Java (в этом примере я хочу, чтобы версия java была 1.8.0 update 65)?

Отрицательный ответ хорош - если различные механизмы упаковки Linux вообще не хотят, чтобы люди использовали свои репозитории, как это, это нормально - я всегда могу упаковать свою собственную версию JDK в виде zip-файла и просто распаковать ее где-нибудь внутри окружение как часть построения образа, но это куча хлопот, которые я предпочел бы не делать.

Как другие люди делают это? Есть ли другой способ установки JDK, чтобы я мог иметь последнюю версию дистрибутива ОС с последними обновлениями (как определено базовым образом в предложении FROM и обновлением yum), но установить определенную версию JDK?

Существует ли версия Linux, более подходящая для такого рода требований (я не привязан к CentOS, пользовательский дистрибутив Linux не особенно важен для меня)?

Shorn
источник
Будет ли ЯМ-versionlock пути можно использовать с Докерами?
Аарон Копли
1
@AaronCopley Я так не думаю. versionlock, кажется, сосредоточен на том, чтобы убедиться, что версия останется там, где она будет в следующий раз, когда вы запустите обновление, но я на самом деле обеспокоен тем, чтобы команда начальной установки не провалилась после того, как репозиторий перешел на новую версию. Я не планирую когда-либо снова запускать ням-обновления в этой конкретной среде. Когда среда требует новых обновлений, будет создан новый образ докера (и я хочу, чтобы этот образ использовал ту же версию JDK, что и сейчас).
Стрельба
1
Извините, я думаю, что неправильно понял. Вы можете видеть, что запрашиваемая версия находится в базе, и она устанавливается из обновлений по любой причине. Попробуйтеyum install -y $package --disablerepo=updates
Аарон Копли
1
@AaronCopley Да, похоже, работает - спасибо! Если вы сделаете ответ, я отмечу его как успешный. Или я сам добавлю это позже.
Стрельба

Ответы:

2

Похоже, он видит пакет, который вы хотите, но по какой-либо причине устанавливается из репозитория обновлений.

Вы можете отключить хранилище обновлений в своей команде yum;

yum install -y $package --disablerepo=updates
Аарон Копли
источник