Я создаю файл 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.
Я изменил файл докера, чтобы он выглядел так:
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
Как я могу перестроить свой файл докеров, чтобы всегда использовать определенную версию Java (в этом примере я хочу, чтобы версия java была 1.8.0 с обновлением 65)?
Отрицательный ответ - это нормально - если различные механизмы упаковки Linux в целом не хотят, чтобы люди использовали свои репозитории подобным образом, это нормально - я всегда могу упаковать свою версию JDK в виде zip-файла и просто распаковать его где-нибудь внутри окружение как часть сборки образа, но это куча хлопот, от которых я бы предпочел избавиться.
Как это делают другие люди? Есть ли другой способ установки JDK, чтобы я мог иметь последнюю версию дистрибутива ОС с последними обновлениями (как определено базовым образом в предложении FROM и обновлении yum), но установить определенную версию JDK?
Есть ли версия Linux, более подходящая для такого рода требований (я не привязан к CentOS, пользовательский дистрибутив Linux не особенно важен для меня)?
Похоже, он видит нужный вам пакет, но по какой-то причине устанавливает его из репозитория обновлений.
Вы можете отключить репозиторий обновлений в своей команде yum;
yum install -y $package --disablerepo=updates