¿Cómo instalar una versión de paquete específica en Alpine?

90

Tengo Dockerfileque construir una imagen Docker que se base en Alpine Linux. Ahora necesito instalar un paquete como parte de esto Dockerfile.

Actualmente tengo:

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

Aparentemente, esta es una mala idea, ya que el resultado no es determinista. En cambio, depende del momento en el que construyo la imagen, de qué versión gitse está instalando.

¿Cuál es la forma correcta de hacer esto?

Supongo que tengo que decir updated, upgradey addqué versiones de usar, pero ¿cómo puedo hacer esto?

He visto que apkadmite la fijación de repositorios, pero eso no es lo que quiero (al menos eso creo), porque no quiero anclar un repositorio, sino un paquete.

En otras palabras: si gitpudiera instalarse a través de npm, podría ejecutar:

npm install [email protected]

(o cualquier versión que quiera tener). ¿Cuál es el equivalente a esto para Alpine Linux?

Golo Roden
fuente

Respuestas:

79

Puede configurar versiones "adhesivas" como esta:

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

Eso actualizará los paquetes solo hasta la versión especificada. Entonces puede usar con seguridad ...

apk upgrade

para actualizar todos los paquetes, mientras que los paquetes con versiones permanecerán con su versión. Para establecer una versión mínima solo use ...

apk add "packagename>1.2.3-suffix"

En caso de que no pueda encontrar un paquete, mientras puede verlo en la interfaz de usuario de los paquetes Alpine, actualice su fuente / base de datos de paquetes:

apk update

El repositorio de paquetes se puede encontrar aquí :

https://pkgs.alpinelinux.org/packages
emperador
fuente
¿Estás seguro de que esto funciona? De este hilo, parece que en realidad no hace nada: forum.alpinelinux.org/forum/general-discussion/…
Travis Reeder
2
@TravisR Echa un vistazo a los documentos APK de Alpine aquí .
kaiser
¡En mi caso, ayudó a bajar de alpine 3.7 a alpine 3.6!
DUzun
Los rangos Semver tilde también funcionan como en el apk add ansible~=2.4.1significado >=2.4.1 <2.5.0. Echa un vistazo a jubianchi.github.io/semver-check para probar tus propios rangos.
Mike D
El repositorio con la lista de paquetes disponibles pkgs.alpinelinux.org/packages fue el más útil para mí.
Egel
16

Actualmente, no hay forma de instalar versiones anteriores arbitrarias de un paquete desde repositorios oficiales en Alpine Linux. Lo mejor que puede lograr es usar repositorios de las versiones anteriores:

# 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
Vlad Frolov
fuente
1

Porque estaba usando el testingrepositorio. Terminé construyendo mi propia copia. Pasos:

Ir a los detalles del paquete. Ex:

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

Haga clic en la confirmación, haga clic en los enlaces del archivo APKBUILD y "Registro" en el menú para obtener el registro de confirmación del archivo APKBUILD. Luego elija un commit para su archivo APKBUILD y descárguelo. Ex:

https://git.alpinelinux.org/cgit/aports/tree/testing/watchman/APKBUILD?id=63f5e7d295659a855709901ce22a3e5f40fce455

Instale las herramientas de compilación:

apk -U add alpine-sdk

Debes no ser rootusuario, así que crea un packagerusuario con contraseña:

adduser -D packager && addgroup packager abuild
passwd packager

Luego packagercompílelo como en el mismo directorio que el archivo APKBUILD:

su - packager
abuild-keygen -a -i
abuild -r

Es posible que deba descubrir errores e instalar dependencias. En mi ejemplo, necesitaba hacer esto en mi imagen existente de Docker como root:

apk add python-dev

Después de una compilación exitosa como packager, instálela como root:

apk add /home/packager/packages/<something...>/watchman-4.7.0-r0.apk --allow-untrusted

No estoy seguro de cómo quitar la --allow-untrustedpieza, pero los pasos funcionaron para mí.

s12chung
fuente