2016-03-20 08:45:08 +0000 2016-03-20 08:45:08 +0000
102
102

Как установить конкретную версию пакета в 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?

Ответы (5)

89
89
89
2016-03-29 14:25:32 +0000

Вы можете установить “липкие” версии вот так:

# Both are equal
apk add packagename=1.2.3-suffix
apk add 'packagename<1.2.3-suffix'

Это позволит обновлять пакеты только до указанной версии. Затем вы можете безопасно использовать …

apk upgrade

для обновления всех пакетов, в то время как пакеты с версиями останутся со своей версией. Чтобы установить версию minimum, просто используйте …

apk add "packagename>1.2.3-suffix"

В случае, если вы не можете найти пакет, в то время как вы можете увидеть его в пользовательском интерфейсе для пакетов Alpine, обновите базу исходных текстов/пакетов:

apk update

Хранилище пакетов ** можно найти здесь **:

https://pkgs.alpinelinux.org/packages

Никогда не прикрепляйте пакеты из “пограничной” ветки repo пакета alpine, так как они находятся в тестовом режиме и могут быть отозваны. (На pkgs.alpinelinux.org/packages , нажмите “edge” и измените его на используемую вами версию альпийского изображения, а затем снова нажмите “search”).

17
17
17
2016-03-25 08:30:23 +0000

В настоящее время нет возможности установить произвольные старые версии пакета из официальных репозиториев в 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
1
1
1
2020-02-14 21:42:45 +0000

Синтаксис для пиннинга альпийских пакетов с помощью apk - apk add packageName==x.y.z.

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

Вы можете просмотреть пакеты alpine по адресу https://pkgs.alpinelinux.org/packages . К сожалению, по умолчанию используется ветка edge, содержащая пакеты, которые могут быть отозваны.

Из https://pkgs.alpinelinux.org/packages , введите имя нужного пакета, измените ветку с edge на версию изображения alpine, которую вы используете , и установите Arch (архитектура), а затем нажмите search. (Если вы не знакомы с архитектурой, запустите контейнер и наберите uname -m.)

Это покажет вам ** только стабильную версию(ы)** пакета, которую вы можете safely pin to. Пиннинг пакета на другую версию может привести к тому, что ваш Dockerfile перестанет работать в один прекрасный день из-за того, что пакет будет отозван из репозитория пакета alpine.

Пример:

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
1
1
1
2020-02-26 16:02:56 +0000

Влад Фролов уже дал ответ. Я пишу докерское решение. Пытался добавить пакет из репозитория v3.8.

  • Просмотрите старый архив http://dl-cdn.alpinelinux.org/alpine/ и получите конкретную репозиторийную версию вашего программного обеспечения.
  • После получения репозитория версии, добавьте версию в ваш докерный файл
  • Укажите точную версию вашего пакета из репозитория.
1
1
1
2018-08-21 17:55:01 +0000

Потому что я использовал testing repo. В итоге я создал свою собственную копию. Шаги:

Перейти к деталям пакета. Ex: https://pkgs.alpinelinux.org/package/edge/testing/armhf/watchman

Нажмите на фиксацию, нажмите на ссылки на файл APKBUILD и “Журнал” в меню, чтобы получить журнал фиксации файла APKBUILD. Затем выберите коммит для вашего файла APKBUILD и загрузите его. Ex: https://git.alpinelinux.org/cgit/aports/tree/testing/watchman/APKBUILD?id=63f5e7d295659a855709901ce22a3e5f40fce455

Установите инструменты для сборки:

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, но шаги мне помогли.