Как установить конкретную версию пакета в Alpine?
У меня есть Dockerfile
создать образ Docker, основанный на Alpine Linux. Теперь мне нужно установить пакет как часть этого Dockerfile
,
В настоящее время у меня есть:
RUN apk update && \
apk upgrade && \
apk add git
По-видимому, это плохая идея, так как результат является недетерминированным. Вместо этого это зависит от момента времени, в который я строю образ, какая версия git
устанавливается
Как правильно это сделать?
Я думаю, что я должен сказать updated
, upgrade
а также add
какие версии использовать, но как мне это сделать?
Я видел это apk
поддерживает закрепление репозиториев, но это не то, что я хочу (по крайней мере, я так думаю), потому что я не хочу закреплять репозиторий, а пакет.
Другими словами: если git
может быть установлен через npm
Я бы смог запустить:
npm install git@1.9.2
(или любую другую версию, которую я хочу иметь). Что эквивалентно этому для Alpine Linux?
6 ответов
Вы можете установить "липкие" версии следующим образом:
# Both are equal
apk add packagename=1.2.3-suffix
apk add 'packagename<1.2.3-suffix'
Это будет обновлять пакеты только до указанной версии. Вы можете безопасно использовать...
apk upgrade
обновить все пакеты, в то время как пакеты с версиями останутся с их версией. Чтобы установить минимальную версию, просто используйте...
apk add "packagename>1.2.3-suffix"
Если вы не можете найти пакет, а можете видеть его в пользовательском интерфейсе для пакетов Alpine, обновите базу данных источников / пакетов:
apk update
Репозиторий пакетов можно найти здесь:
https://pkgs.alpinelinux.org/packages
В настоящее время нет возможности установить произвольные более старые версии пакета из официальных репозиториев в Alpine Linux. Лучшее, что вы можете достичь, это использовать репозитории предыдущих выпусков:
# cat /etc/alpine-release
3.3.3
# echo 'http://dl-cdn.alpinelinux.org/alpine/v3.2/main' >> /etc/apk/repositories
# apk update
fetch http://dl-cdn.alpinelinux.org/alpine/v3.3/community/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.3/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.2/main/x86_64/APKINDEX.tar.gz
# apk add bash==4.3.33-r0
(1/1) Updating pinning bash (4.3.33-r0)
OK: 13 MiB in 17 packages
# apk add bash==4.3.42-r3
(1/2) Upgrading bash (4.3.33-r0 -> 4.3.42-r3)
Executing bash-4.3.42-r3.post-upgrade
(2/2) Purging ncurses5-libs (5.9-r1)
Executing busybox-1.24.1-r7.trigger
OK: 13 MiB in 16 packages
Синтаксис для закрепления пакетов alpine с помощью apk:
apk add packageName=x.y.z
.
Чтобы установить минимальную версию, используйте
apk add packageName>x.y.z
Пример:
FROM alpine:3.3
RUN apk update && apk upgrade
RUN apk add --no-cache \
git=2.8.6-r0 \
bash=4.3.42-r6 \
python3=3.5.1-r0
Однако из официального репозитория пакетов Alpine можно удалить любую версию пакета из любой ветки. Это означает, что если вы прикрепите свой пакет к точной версии в вашем Dockerfile, ваш Dockerfile может не работать в будущем.
Официальная рекомендация для закрепления точных версий пакетов, чтобы сохранить собственное зеркало / репозиторий со всем пакетом конкретного и их версию, которые вы можете использовать.
В качестве альтернативы вы можете использовать минимальную версию пакета вместо точной закрепленной версии пакета.
Влад Фролов уже дал ответ. Пишу докер-решение. Пытался добавить какой-то пакет из репозитория v3.8.
- Просмотрите старый архив http://dl-cdn.alpinelinux.org/alpine/ и получите конкретную версию репозитория вашего программного обеспечения.
- После получения версии репозитория добавьте версию в свой файл докера.
Укажите точную версию вашего пакета из репозитория
RUN echo 'http://dl-cdn.alpinelinux.org/alpine/v3.8/main' >> /etc/apk/repositories RUN apk update RUN apk --no-cache add ca-certificates=20190108-r0 gettext=0.19.8.1-r2 postfix=3.3.0-r4 rsyslog=8.34.0-r1 libsasl=2.1.26-r15
Потому что я использовал testing
Сделки РЕПО. Я закончил тем, что создал свою собственную копию. шаги:
Перейти к деталям пакета. Пример:
https://pkgs.alpinelinux.org/package/edge/testing/armhf/watchman
Нажмите на коммит, нажмите на ссылку на файл APKBUILD и "Журнал" в меню, чтобы получить журнал фиксации файла APKBUILD. Затем выберите коммит для вашего файла APKBUILD и загрузите его. Пример:
Установите инструменты сборки:
apk -U add alpine-sdk
Вы должны быть не root
пользователь так создать packager
пользователь с паролем:
adduser -D packager && addgroup packager abuild
passwd packager
Затем построить его как packager
в том же каталоге, что и файл APKBUILD:
su - packager
abuild-keygen -a -i
abuild -r
Возможно, вам придется выяснить ошибки и установить зависимости. В моем примере мне нужно было сделать это на моем существующем образе Docker как root
:
apk add python-dev
После успешной сборки как packager
, установите его как root
:
apk add /home/packager/packages/<something...>/watchman-4.7.0-r0.apk --allow-untrusted
Не уверен, как удалить --allow-untrusted
часть, но шаги работали на меня.
Указание версий пакетов для Alpine Linux не имеет смысла. Зачем вы вообще перестраиваете свои докер-контейнеры? Почему вы не используете реестр образов Docker? Реестр обеспечит детерминированность версий пакетов на основе даты исходной сборки. Похоже, что Alpine Linux диктует версии пакетов на основе версии Alpine Linux. Например, когда я пытаюсь обновить версию Alpine Linux с 3.9 до 3.17 с указанными версиями пакета, Dockerfile не собирается, и я получаю следующую ошибку.
DockerFile
FROM alpine:3.17
RUN apk add --update --no-cache \
bash=4.4.19-r1 \
lftp=4.8.4-r1 \
curl=7.64.0-r5
Ошибка сборки DockerFile
ОШИБКА: невозможно выбрать пакеты: Баш-5.2.12-r0: перерывы: мир[bash=4.4.19-r1] локон-7.86.0-r1: перерывы: мир [curl=7.64.0-r5] lftp-4.9.2-r4: перерывы: мир[lftp=4.8.4-r1]
Это имеет смысл, если вы посмотрите на то, как организованы пакеты Alpine Linux: для каждой версии Alpine Linux существует одна версия пакета.