docker – Alpineで特定のパッケージバージョンをインストールするには?

alpine-linux docker package-management

Alpine LinuxをベースにしたDockerイメージを構築するためのDockerfileを持っています。このDockerfileの一部としてパッケージをインストールする必要があります

現在、私は持っています

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

どうやら、結果が非決定論的になるので、これは良くない考えのようです。その代わり、イメージをビルドした時点でどのバージョンのgitがインストールされているかに依存します

正しいやり方とは?

updated, upgrade, addのどのバージョンを使えばいいのか教えてあげないといけないと思うのですが、どうすればいいのでしょうか?

apkがリポジトリのピン留めをサポートしているのを見たことがありますが、リポジトリではなくパッケージをピン留めしたいので、それは私が望むものではありません(少なくとも私はそう思っています)

言い換えればgitnpmを経由してインストールできれば、実行できるのに

npm install git@1.9.2

(または私が欲しいバージョン)。アルパインリナックスの場合はこれに相当するものがあるのでしょうか?

  124  Golo Roden  2016-03-20


ベストアンサー

こんな感じで「べたべた」バージョンを設定できます

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

これは、指定したバージョンまでのパッケージのみをアップグレードします。その後は安全に

apk upgrade

を使用してすべてのパッケージをアップグレードします。最小バージョンを設定するには

apk add "packagename>1.2.3-suffix"

AlpineパッケージのUIでパッケージが表示されているのに見つからない場合は、ソース/パッケージデータベースを更新してください

apk update

パッケージリポジトリは こちら にあります

https://pkgs.alpinelinux.org/packages

alpine パッケージレポの “edge” ブランチのパッケージをピン留めしないでください。(pkgs.alpinelinux.org/packages で “edge” をクリックして、使用している alpine イメージのバージョンに変更してから、再度 “search” をクリックしてください)


カウリネーターによる追加情報です

パッケージを正確なバージョンに固定すると、そのパッケージが レポから削除され、あなたの Dockerfile が将来ビルドに失敗するリスクがあります。公式勧告はここで読むことができます

あるいは、正確なバージョンではなく、パッケージの最小バージョンを設定することもできます

現在のところ、ビルドされたすべてのパッケージをインフラスに無期限に保存するリソースを持っていません。そのため、現在は各安定版ブランチの最新版のみを保存しており、これまでもそのようにしてきました

将来的には、すべてのパッケージに Alpine というタグを付けておくという議論がありましたが、これはまだ「進行中」です。しかし、これはまだ「進行中」です。公式な推奨事項としては、あなた自身のミラー/リポジトリに、あなたが使いたいと思うすべての特定のパッケージとそのバージョンを保存しておくことです

– ティモ・テラース、@fabled(アルペン)


Alpine Linuxの完全な組織リポジトリは、このセルフホスティングされたGitLabインスタンスで見つけることができます

116  kaiser  2016-03-29


現在のところ、Alpine Linuxでは、公式リポジトリから任意の古いバージョンのパッケージをインストールする方法はありません。最良の方法は、以前のリリースのリポジトリを使用することです

# 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

20  Vlad Frolov  2016-03-25


alpineパッケージをapkでピン留めするための構文はapk add packageName=x.y.zです

最小バージョンを設定するには、apk add packageName>x.y.zを使用します

Example:

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

しかし、アルパインの公式パッケージレポは、どのブランチからでもパッケージのバージョンを落とすことができますつまり、Dockerfileでパッケージを正確なバージョンにピン留めしてしまうと、将来的にDockerfileが動作しなくなる可能性があるということです

正確なパッケージのバージョンを固定するための公式な推奨事項は、使用したいと思われるすべての特定のパッケージとそのバージョンのミラー/リポジトリを自分のものにしておくことです

別の方法として、正確なピン留めされたパッケージのバージョンではなく、最小のパッケージのバージョンを使用することもできます

5  cowlinator  2020-02-14


ヴラド・フロロフはすでに答えを出しています。私はdockerソリューションを書いています。私はv3.8リポジトリからいくつかのパッケージを追加しようとしていました

  • http://dl-cdn.alpinelinux.org/alpine/ 古いアーカイブを参照して、あなたのソフトウェアの特定のリポジトリのバージョンを取得します
  • リポジトリのバージョンを取得したら、dockerファイルにバージョンを追加します
  • リポジトリからパッケージの正確なバージョンを指定します

    RUN echo 'http://dl-cdn.alpinelinux.org/alpine/v3.8/main' >> /etc/apk/repositories
    RUN apk update
    RUN apk --no-cache add ca-certificates=20190108-r0 gettext=0.19.8.1-r2 postfix=3.3.0-r4 rsyslog=8.34.0-r1 libsasl=2.1.26-r15
    

3  maruf571  2020-02-26


testingのレポを使っていたので結局自分で作ることになりました。ステップです

パッケージの詳細へ例

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

コミットをクリックして、APKBUILDファイルのリンクをクリックし、メニューの「ログ」をクリックすると、APKBUILDファイルのコミットログが表示されます。そして、APKBUILDファイルのコミットを選択してダウンロードしてください。例

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

ビルドツールをインストールします

apk -U add alpine-sdk

rootユーザではない必要があるので、パスワードを指定してpackagerユーザを作成してください

adduser -D packager && addgroup packager abuild
passwd packager

そして、APKBUILDファイルと同じディレクトリにpackagerとしてビルドします

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

エラーを把握して依存関係をインストールする必要があるかもしれません。私の例では、既存のDockerイメージをrootとして、これを行う必要がありました

apk add python-dev

packagerとしてビルドに成功したら、rootとしてインストールしてください

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

--allow-untrustedの部分を削除する方法はわかりませんが、手順は私のために機能しました

2  s12chung  2018-08-21


タイトルとURLをコピーしました