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

Como instalar uma versão de pacote específico em Alpine?

Tenho um Dockerfile para construir uma imagem Docker que é baseada no Linux alpino. Agora preciso de instalar um pacote como parte deste Dockerfile.

Actualmente tenho:

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

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

Qual é a forma correcta de o fazer?

Acho que tenho de dizer updated, upgrade e add quais as versões a utilizar, mas como o faço?

Já vi que apk suporta a localização de repositórios, mas não é isso que eu quero (pelo menos penso que sim), porque não quero localizar um repositório, mas sim um pacote.

Por outras palavras: Se o git pudesse ser instalado via npm, seria capaz de correr:

npm install git@1.9.2

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

Respostas (5)

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

Pode definir versões “pegajosas” como esta:

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

Isso irá actualizar os pacotes apenas até à versão especificada. Poderá então utilizar com segurança …

apk upgrade

para actualizar todos os pacotes, enquanto os pacotes com versões permanecerão com a sua versão. Para definir uma versão minimum basta usar …

apk add "packagename>1.2.3-suffix"

Caso não consiga encontrar um pacote, enquanto o pode ver na IU para pacotes Alpinos, actualize a sua base de dados de fontes/pacotes:

apk update

O repositório de pacotes ** pode ser encontrado aqui ***:

https://pkgs.alpinelinux.org/packages

Nunca pinem pacotes do ramo “edge” do repositório de pacotes alpinos, pois estes estão em teste e podem ser revogados. (Em pkgs.alpinelinux.org/packages , clique em “edge” e mude-o para a versão de imagem alpina que utiliza, e clique novamente em “search”).

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

Actualmente, não há forma de instalar versões antigas arbitrárias de um pacote a partir de repositórios oficiais no Alpine Linux. O melhor que se pode conseguir é utilizar 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
1
1
1
2020-02-14 21:42:45 +0000

A sintaxe para fixar as embalagens alpinas com apk é apk add packageName==x.y.z.

No entanto, ao fixar os pacotes alpinos em ** imagens docker*** , tem de ser cuidadoso para utilizar a versão específica que corresponde à sua imagem, e evitar o edge ramo*.

Pode ver os pacotes alpinos em https://pkgs.alpinelinux.org/packages . Infelizmente, este padrão é o edge branch, que contém pacotes que podem ser revogados*.

A partir de https://pkgs.alpinelinux.org/packages , digite o nome do pacote desejado, ** mude o ramo de edge para corresponder à versão de imagem alpina que está a utilizar** , e defina o Arch (arquitectura), e depois carregue em search. (Se não conhece a arquitectura, execute o contentor e digite uname -m.)

Isto mostrar-lhe-á a(s)** apenas a(s)** versão(ões) estável(s)** do pacote a que pode seleccionar a*. A colocação do pacote numa versão diferente pode fazer com que o seu Dockerfile deixe de funcionar um dia devido ao pacote ter sido revogado do repositório de pacotes alpinos.

Exemplo:

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 já deu a resposta. Estou a escrever a solução portuária. Estava a tentar adicionar algum pacote do repositório v3.8.

  • Procure no arquivo antigo http://dl-cdn.alpinelinux.org/alpine/ e obtenha a versão específica do repositório do seu software. & - Depois de obter a versão do repositório, adicione a versão no seu ficheiro docker & - Especifique a versão exacta do seu pacote a partir do repositório
1
1
1
2018-08-21 17:55:01 +0000

Porque eu estava a usar o testing repo. acabei por construir a minha própria cópia. Passos:

Ir para detalhes da embalagem. Ex: https://pkgs.alpinelinux.org/package/edge/testing/armhf/watchman

Clique no commit, clique nos links do ficheiro APKBUILD e “Log” no menu para obter o registo de commit do ficheiro APKBUILD. Depois escolha uma submissão para o seu ficheiro APKBUILD e descarregue-o. Ex: https://git.alpinelinux.org/cgit/aports/tree/testing/watchman/APKBUILD?id=63f5e7d295659a855709901ce22a3e5f40fce455

Instale as ferramentas de construção:

apk -U add alpine-sdk

Não precisa de ser root utilizador, por isso crie um packager utilizador com password:

adduser -D packager && addgroup packager abuild
passwd packager

Depois construa-o como packager no mesmo directório que o ficheiro APKBUILD:

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

Talvez seja necessário descobrir erros e instalar dependências. No meu exemplo, precisava de o fazer na minha imagem Docker existente como root:

apk add python-dev

Após uma construçã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 parte --allow-untrusted, mas os passos funcionaram para mim.