67

У меня есть 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?

3 ответа3

56

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

# 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
12

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

Потому что я использовал репо- 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 часть, но шаги сработали для меня.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .