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

59

Eu tenho um Dockerfile para criar uma imagem do Docker baseada no Alpine Linux. Agora preciso instalar um pacote como parte deste Dockerfile .

Atualmente, tenho:

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

Aparentemente, esta é uma má ideia, pois o resultado é não-determinístico. Em vez disso, depende do momento em que eu construo a imagem, qual versão de git está sendo instalada.

Qual é a maneira correta de fazer isso?

Eu acho que tenho que dizer updated , upgrade e add quais versões usar, mas como faço isso?

Eu vi que apk suporta pinagem de repositórios, mas não é isso que eu quero (pelo menos eu acho), porque eu não quero fixar um repositório, mas um pacote.

Em outras palavras: se git pudesse 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?

    
por Golo Roden 20.03.2016 / 09:45

3 respostas

49

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

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

Isso atualizará os pacotes somente até a versão especificada. Você pode então 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 você não encontre 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
    
por 29.03.2016 / 16:25
11

Atualmente, não há como instalar versões antigas e arbitrárias de um pacote de repositórios oficiais no Alpine Linux. A melhor coisa que você pode conseguir é usar os repositórios dos lançamentos 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
    
por 25.03.2016 / 09:30
0

Porque eu estava usando o testing repo. Acabei construindo minha própria cópia. Etapas:

Acesse os detalhes do pacote. Ex:

link

Clique no commit, clique nos links do arquivo APKBUILD e em "Log" no menu para obter o registro de commit do arquivo APKBUILD. Em seguida, escolha um commit para o seu arquivo APKBUILD e baixe-o. Ex:

link

Instale as ferramentas de criação:

apk -U add alpine-sdk

Você precisa não ser o usuário root , portanto, crie um usuário packager com senha:

adduser -D packager && addgroup packager abuild
passwd packager

Em seguida, construa-o como packager no mesmo diretório que o arquivo APKBUILD:

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

Você pode precisar descobrir erros e instalar dependências. No meu exemplo, eu precisava fazer isso na imagem existente do Docker como root :

apk add python-dev

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

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

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

    
por 21.08.2018 / 19:55