Como instalar uma versão específica do pacote no Alpine?

90

Eu tenho Dockerfileque construir uma imagem do Docker baseada no Alpine Linux. Agora eu preciso instalar um pacote como parte disso Dockerfile.

Atualmente tenho:

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

Aparentemente, essa é uma péssima idéia, pois o resultado é não determinístico. Em vez disso, depende do momento em que eu construo a imagem, qual versão gitestá sendo instalada.

Qual é a maneira correta de fazer isso?

Eu acho que eu tenho que dizer updated, upgradee addquais versões de usar, mas como posso fazer isso?

Eu já vi que apksuporta a fixação de repositórios, mas não é isso que eu quero (pelo menos acho que sim), porque não quero fixar um repositório, mas um pacote.

Em outras palavras: se gitpudesse ser instalado via npm, eu seria capaz de executar:

npm install [email protected]

(ou qualquer versão que eu queira ter). Qual é o equivalente a isso para o Alpine Linux?

Golo Roden
fonte

Respostas:

79

Você pode definir versões "aderentes" como esta:

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

Isso atualizará os pacotes apenas até a versão especificada. Você pode usar com segurança…

apk upgrade

para atualizar todos os pacotes, enquanto os pacotes com versões permanecerão com sua versão. Para definir uma versão mínima, basta usar…

apk add "packagename>1.2.3-suffix"

Caso não consiga encontrar um pacote, enquanto você pode vê-lo na interface do usuário para pacotes Alpine, atualize seu banco de dados de fontes / pacotes:

apk update

O repositório de pacotes pode ser encontrado aqui :

https://pkgs.alpinelinux.org/packages
kaiser
fonte
Tem certeza de que isso funciona? A partir deste tópico, parece que ele realmente não faz nada: forum.alpinelinux.org/forum/general-discussion/…
Travis Reeder
2
@TravisR Dê uma olhada nos documentos do Alpine APK aqui .
Kaiser
No meu caso, ajudou a fazer o downgrade do alpine 3.7 para o alpine 3.6!
DUzun
Os intervalos de semver til também funcionam como no apk add ansible~=2.4.1significado >=2.4.1 <2.5.0. Confira jubianchi.github.io/semver-check para testar seus próprios intervalos.
Mike D
O repositório com a lista de pacotes disponíveis pkgs.alpinelinux.org/packages foi o mais útil para mim.
Egel
16

Atualmente, não há como instalar versões antigas arbitrárias de um pacote a partir de repositórios oficiais no Alpine Linux. A melhor coisa que você pode conseguir é usar repositórios das versões 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
fonte
1

Porque eu estava usando o testingrepositório. Acabei construindo minha própria cópia. Passos:

Vá para os detalhes do pacote. Ex:

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

Clique no commit, clique nos links do arquivo APKBUILD e em "Log" no menu para obter o log de confirmação do arquivo APKBUILD. Em seguida, escolha uma confirmação para o seu arquivo APKBUILD e faça o download. Ex:

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

Instale as ferramentas de construção:

apk -U add alpine-sdk

Como você não é rootusuário, crie um packagerusuário com senha:

adduser -D packager && addgroup packager abuild
passwd packager

Em seguida, crie-o packagerno mesmo diretório que o arquivo APKBUILD:

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

Pode ser necessário descobrir erros e instalar dependências. No meu exemplo, eu precisava fazer isso na minha imagem existente do Docker como root:

apk add python-dev

Após uma compilação bem-sucedida como packager, instale-a como root:

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

Não sei como remover a --allow-untrustedpeça, mas as etapas funcionaram para mim.

s12chung
fonte