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

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

Tengo un Dockerfile para construir una imagen Docker que está basada en Alpine Linux. Ahora necesito instalar un paquete como parte de este Dockerfile.

Actualmente tengo:

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

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

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

Supongo que tengo que decirle a updated, upgrade y add qué versiones usar, pero ¿cómo lo hago?

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

En otras palabras: Si git se pudiera instalar a través de npm, podría ejecutar:

npm install git@1.9.2

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

Respuestas (5)

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

Puede establecer versiones “pegajosas” de la siguiente manera:

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

Eso actualizará los paquetes sólo 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 sólo tiene que usar …

apk add "packagename>1.2.3-suffix"

En caso de que no pueda encontrar un paquete, mientras que puede verlo en la UI de paquetes Alpine, actualice su base de datos de fuentes/paquetes:

apk update

El repositorio de paquetes puede ser encontrado aquí :

https://pkgs.alpinelinux.org/packages

Nunca fije paquetes de la rama “edge” del repo de paquetes de alpine, ya que están en pruebas y pueden ser revocados. (En pkgs.alpinelinux.org/packages , haz clic en “edge” y cámbialo por la versión de la imagen alpina que utilices, y vuelve a hacer clic en “search”).

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

Actualmente, no hay forma de instalar versiones antiguas arbitrarias de un paquete desde los repositorios oficiales en Alpine Linux. Lo mejor que se puede conseguir es utilizar los 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
1
1
1
2020-02-14 21:42:45 +0000

La sintaxis para anclar paquetes alpinos con apk es apk add packageName==x.y.z.

Sin embargo, al anclar los paquetes alpinos en imágenes de docker , tiene que tener cuidado de usar la versión específica que coincida con su imagen, y evitar la rama edge.

Puede ver los paquetes alpinos en https://pkgs.alpinelinux.org/packages . Desgraciadamente, esta rama es por defecto la edge , que contiene paquetes que pueden ser revocados.

Desde https://pkgs.alpinelinux.org/packages , escriba el nombre del paquete que desea, cambie la rama de edge para que coincida con la versión de la imagen alpina que está utilizando , y ponga el Arch (arquitectura), y luego pulse search. (Si no conoce la arquitectura, ejecute el contenedor y escriba uname -m.)

Esto le mostrará la única(s) versión(es) estable(s) del paquete a la(s) cual(es) puede(n) anclar con seguridad**. Anclar el paquete a una versión diferente puede hacer que su Dockerfile deje de funcionar un día debido a que el paquete sea revocado del repositorio de paquetes de alpine.

Ejemplo:

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

Vlad Frolov ya dio la respuesta. Estoy escribiendo la solución docker. Estaba tratando de añadir algún paquete del repositorio v3.8.

  • Examine el archivo antiguo http://dl-cdn.alpinelinux.org/alpine/ y obtenga la versión específica del repositorio de su software.
  • Después de obtener la versión del repositorio, añada la versión en su archivo docker
  • Especifique la versión exacta de su paquete desde el repositorio
1
1
1
2018-08-21 17:55:01 +0000

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

Ir a los detalles del paquete. Ej: https://pkgs.alpinelinux.org/package/edge/testing/armhf/watchman

Haz clic en el commit, haz clic en los enlaces del archivo APKBUILD y “Log” en el menú para obtener el registro de commit del archivo APKBUILD. A continuación, elija un commit para su archivo APKBUILD y descárguelo. Ej: https://git.alpinelinux.org/cgit/aports/tree/testing/watchman/APKBUILD?id=63f5e7d295659a855709901ce22a3e5f40fce455

Instalar las herramientas de compilación:

apk -U add alpine-sdk

Necesita ser un usuario no root así que cree un usuario packager con contraseña:

adduser -D packager && addgroup packager abuild
passwd packager

Luego construya como packager en el mismo directorio que el archivo APKBUILD:

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

Puede que necesites resolver errores e instalar dependencias. En mi ejemplo, necesitaba hacer esto en mi imagen Docker existente como root:

apk add python-dev

Después de una construcció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 eliminar la parte --allow-untrusted, pero los pasos me funcionaron.