it-swarm.com.ru

Как установить конкретную версию пакета в Alpine?

У меня есть Dockerfile для создания образа Docker, основанного на Alpine Linux. Теперь мне нужно установить пакет как часть этой Dockerfile.

В настоящее время у меня есть:

RUN apk update && \
    apk upgrade && \
    apk add git

По-видимому, это плохая идея, так как результат является недетерминированным. Вместо этого это зависит от того, в какой момент времени я создаю образ, какая версия git устанавливается.

Как правильно это сделать?

Я предполагаю, что я должен сказать updated, upgrade и add, какие версии использовать, но как мне это сделать?

Я видел, что apk поддерживает закрепление репозиториев, но это не то, чего я хочу (по крайней мере, мне так кажется), потому что я не хочу закреплять репозиторий, а пакет.

Другими словами: если git может быть установлен через npm, я смогу запустить:

npm install [email protected]

(или любую другую версию, которую я хочу иметь). Что эквивалентно этому для Alpine Linux?

75
Golo Roden

Вы можете установить «липкие» версии следующим образом:

# 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
64
kaiser

В настоящее время нет возможности установить произвольные более старые версии пакета из официальных репозиториев в 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
13
Vlad Frolov

Потому что я использовал репозиторий testing. Я закончил тем, что создал свою собственную копию. шаги:

Перейти к деталям пакета. Пример:

https://pkgs.alpinelinux.org/package/Edge/testing/armhf/watchman

Нажмите на коммит, нажмите на ссылку на файл APKBUILD и «Журнал» в меню, чтобы получить журнал фиксации файла APKBUILD. Затем выберите коммит для вашего файла APKBUILD и загрузите его. Пример:

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, но шаги сработали для меня.

1
s12chung