Alpine包管理工具apk使用介紹

在這裏插入圖片描述

Alpine以它的小巧和實用深受總多開發者的喜愛,而提到Alpine的Linux,其包管理工具apk則是在Alpine中使用廣泛的一個工具,這篇文章簡要介紹一下常見的使用方式。

什麼是apk

Alpine Linux的包管理工具主要包含兩部分內容:

  • 包管理:提供安裝/更新/刪除包的功能
  • 系統備份恢復:將系統恢復至之前安裝和配置的備份狀態

而具體實現上述兩部分功能的工具則是apk和lbu

功能 工具 縮寫
包管理 apk Alpine Linux package manager.
系統備份恢復 lbu Alpine Local Backup

這篇文章主要介紹包管理工具apk的使用方法。常見命令的使用說明如下所示:

命令類別 子命令 命令說明
包管理 add 添加指定包並確認所有依賴滿足要求
包管理 del 刪除指定包
系統維護 fix 在不改動主要的依賴的情況下進行包的修復或者升級
系統維護 update 從遠程倉庫獲取信息更新本地倉庫索引
系統維護 upgrade 對已安裝了的包進行更新
系統維護 cache 對緩存進行操作,比如對缺失的包進行緩存或者對於不需要的包進行緩存刪除
信息查詢 info 對於指定的包進行包或者倉庫的詳細信息進行顯示
信息查詢 list 按照指定條件進行包的列表信息顯示
信息查詢 search 查詢相關的包的詳細信息
信息查詢 dot 生成依賴之間的關聯關係圖(使用箭頭描述)
信息查詢 policy 顯示包的倉庫策略信息
信息查詢 stats 顯示倉庫和包的安裝相關的統計信息
倉庫管理 index 使用文件生成倉庫索引文件
倉庫管理 fetch 從全局倉庫下載包到本地目錄
倉庫管理 verify 驗證包的完整性和簽名信息
倉庫管理 manifest 顯示package各組成部分的checksum

環境準備

在本文接下來的內容中將就上述命令的常見用法進行整理和總結,驗證的環境爲Alpine的官方鏡像3.10.2,鏡像信息如下所示

[root@host132 ~]# docker pull alpine:3.10.2
3.10.2: Pulling from library/alpine
Digest: sha256:72c42ed48c3a2db31b7dafe17d275b634664a708d901ec9fd57b1529280f01fb
Status: Downloaded newer image for alpine:3.10.2
[root@host132 ~]# docker images |grep alpine |grep 3.10.2
alpine                                  3.10.2              961769676411        3 weeks ago         5.58MB
[root@host132 ~]# 

Alpine容器版本的確認方法

/etc/alpine-release的文件中記錄了alpine的版本信息,將此文件的內容打印出來即可確認Alpine的版本

執行示例信息如下所示:

[root@host132 ~]# docker run -it --rm alpine:3.10.2 cat /etc/alpine-release
3.10.2
[root@host132 ~]#

常用命令說明

update

命令類別 子命令 命令說明
系統維護 update 從遠程倉庫獲取信息更新本地倉庫索引

update命令用於更新本地索引,這樣很多操作才能執行,否則會提示相關的WARNING

[root@host132 ~]# docker run -it --rm alpine:3.10.2 sh
/ # apk search gcc
WARNING: Ignoring APKINDEX.00740ba1.tar.gz: No such file or directory
WARNING: Ignoring APKINDEX.d8b2a6f4.tar.gz: No such file or directory
/ # 

update命令會將上述提示的兩個APKINDEX的文件從遠端倉庫下載到本地,在Alpine容器中,此文件會保存在/var/cache/apk:

[root@host132 ~]# docker run -it --rm alpine:3.10.2 sh
/ # ls /var/cache/apk
/ # 
/ # apk update
fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/community/x86_64/APKINDEX.tar.gz
v3.10.2-51-g21ccaac25b [http://dl-cdn.alpinelinux.org/alpine/v3.10/main]
v3.10.2-42-g95d37f7648 [http://dl-cdn.alpinelinux.org/alpine/v3.10/community]
OK: 10336 distinct packages available
/ # 
/ # ls /var/cache/apk
APKINDEX.00740ba1.tar.gz  APKINDEX.d8b2a6f4.tar.gz
/ # 

索引文件一旦下載至本地,再次執行諸如apk search等命令則不會出現WARNING信息了

/ # apk search gcc
gcc-zsh-completion-5.7.1-r0
gcc-8.3.0-r0
gccmakedep-1.0.3-r0
gcc-objc-8.3.0-r0
gcc6-6.4.0-r9
libreoffice-common-6.2.7.1-r0
gcc6-java-6.4.0-r9
gcc6-doc-6.4.0-r9
libgcj6-6.4.0-r9
gcc-avr-8.3.0-r0
gcc-gnat-8.3.0-r0
gccmakedep-doc-1.0.3-r0
libgc++-8.0.4-r0
gcc-doc-8.3.0-r0
gcc-avr-doc-8.3.0-r0
libgcc-8.3.0-r0
wine-dev-3.0.4-r1
libstdc++6-6.4.0-r9
/ # 

search

命令類別 子命令 命令說明
信息查詢 search 查詢相關的包的詳細信息

常見用法:apk search
使用場景:查詢所有可用的apk的包的信息

/ # apk search |wc -l
10329
/ #

可以看到當前的3.10.2的索引之下,整體大概有1萬以上apk的可用的包可供安裝

常見用法:apk search -v gcc 或者 apk search gcc
使用場景:查詢所有包名稱中含有gcc的可用的apk的包的信息

/ # apk search -v gcc
gcc-zsh-completion-5.7.1-r0 - Zsh completions for gcc
gcc-8.3.0-r0 - The GNU Compiler Collection
gccmakedep-1.0.3-r0 - Create dependencies in makefiles using 'gcc -M'
gcc-objc-8.3.0-r0 - GNU Objective-C
gcc6-6.4.0-r9 - The GNU Compiler Collection
libreoffice-common-6.2.7.1-r0 - LibreOffice - Common files
gcc6-java-6.4.0-r9 - Java support for GCC
gcc6-doc-6.4.0-r9 - The GNU Compiler Collection (documentation)
libgcj6-6.4.0-r9 - Java runtime library for gcc
gcc-avr-8.3.0-r0 - The GNU Compiler Collection for AVR targets
gcc-gnat-8.3.0-r0 - Ada support for GCC
gccmakedep-doc-1.0.3-r0 - Create dependencies in makefiles using 'gcc -M' (documentation)
libgc++-8.0.4-r0 - A garbage collector for C and C++
gcc-doc-8.3.0-r0 - The GNU Compiler Collection (documentation)
gcc-avr-doc-8.3.0-r0 - The GNU Compiler Collection for AVR targets (documentation)
libgcc-8.3.0-r0 - GNU C compiler runtime libraries
wine-dev-3.0.4-r1 - A compatibility layer for running Windows programs (development files)
libstdc++6-6.4.0-r9 - GNU C++ standard runtime library
/ # 

policy

命令類別 子命令 命令說明
信息查詢 policy 顯示包的倉庫策略信息

使用policy可以查詢包

/ # apk policy gcc
gcc policy:
  8.3.0-r0:
    http://dl-cdn.alpinelinux.org/alpine/v3.10/main
/ # 

stats

命令類別 子命令 命令說明
信息查詢 stats 顯示倉庫和包的安裝相關的統計信息

使用stats可以查詢包整體的安裝統計信息

/ # apk stats
installed:
  packages: 14
  dirs: 88
  files: 78
  bytes: 6348800
  triggers: 1
available:
  names: 24062
  packages: 10336
atoms:
  num: 7243
/ #

info & list

命令類別 子命令 命令說明
信息查詢 info 對於指定的包進行包或者倉庫的詳細信息進行顯示
信息查詢 list 按照指定條件進行包的列表信息顯示

可以通過list和info獲得包的相關信息,以gcc爲例,在安裝之前可以做如下信息確認

/ # which gcc
/ # apk list gcc
gcc-8.3.0-r0 x86_64 {gcc} (GPL LGPL)
/ # 
/ # apk info gcc
gcc-8.3.0-r0 description:
The GNU Compiler Collection

gcc-8.3.0-r0 webpage:
http://gcc.gnu.org

gcc-8.3.0-r0 installed size:
75997184

/ # 

常見用法:apk info 或者 apk info -v
使用場景:查詢已經安裝的所有包的信息

可以看到這正是通過stats命令所列出的14個包與版本的詳細信息

/ # apk info -v
musl-1.1.22-r3
busybox-1.30.1-r2
alpine-baselayout-3.1.2-r0
alpine-keys-2.1-r2
libcrypto1.1-1.1.1c-r0
libssl1.1-1.1.1c-r0
ca-certificates-cacert-20190108-r0
libtls-standalone-2.9.1-r0
ssl_client-1.30.1-r2
zlib-1.2.11-r1
apk-tools-2.10.4-r2
scanelf-1.2.3-r0
musl-utils-1.1.22-r3
libc-utils-0.7.1-r0
/ # apk info -v |wc -l
14
/ #

常見用法:apk info --who-owns 二進制文件名稱
使用場景:查詢指定的二進制文件名所歸屬的包的信息

/ # which wget
/usr/bin/wget
/ # apk info --who-owns /usr/bin/wget
/usr/bin/wget symlink target is owned by busybox-1.30.1-r2
/ # 

add

命令類別 子命令 命令說明
包管理 add 添加指定包並確認所有依賴滿足要求

以安裝gcc爲例安裝最新匹配版本的apk包的命令與執行日誌示例如下所示

/ # apk add gcc
(1/10) Installing binutils (2.32-r0)
(2/10) Installing gmp (6.1.2-r1)
(3/10) Installing isl (0.18-r0)
(4/10) Installing libgomp (8.3.0-r0)
(5/10) Installing libatomic (8.3.0-r0)
(6/10) Installing libgcc (8.3.0-r0)
(7/10) Installing mpfr3 (3.1.5-r1)
(8/10) Installing mpc1 (1.1.0-r0)
(9/10) Installing libstdc++ (8.3.0-r0)
(10/10) Installing gcc (8.3.0-r0)
Executing busybox-1.30.1-r2.trigger
OK: 92 MiB in 24 packages
/ # which gcc
/usr/bin/gcc
/ # gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-alpine-linux-musl/8.3.0/lto-wrapper
Target: x86_64-alpine-linux-musl
Configured with: /home/buildozer/aports/main/gcc/src/gcc-8.3.0/configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --build=x86_64-alpine-linux-musl --host=x86_64-alpine-linux-musl --target=x86_64-alpine-linux-musl --with-pkgversion='Alpine 8.3.0' --enable-checking=release --disable-fixed-point --disable-libstdcxx-pch --disable-multilib --disable-nls --disable-werror --disable-symvers --enable-__cxa_atexit --enable-default-pie --enable-default-ssp --enable-cloog-backend --enable-languages=c,c++,objc,fortran,ada --disable-libssp --disable-libmpx --disable-libmudflap --disable-libsanitizer --enable-shared --enable-threads --enable-tls --with-system-zlib --with-linker-hash-style=gnu
Thread model: posix
gcc version 8.3.0 (Alpine 8.3.0) 
/ # 

安裝之後,則可以看到,整體的stats和info都能看到從原來的14個已安裝的包,變成了24個已安裝的包

/ # apk info -v
musl-1.1.22-r3
busybox-1.30.1-r2
alpine-baselayout-3.1.2-r0
alpine-keys-2.1-r2
libcrypto1.1-1.1.1c-r0
libssl1.1-1.1.1c-r0
ca-certificates-cacert-20190108-r0
libtls-standalone-2.9.1-r0
ssl_client-1.30.1-r2
zlib-1.2.11-r1
apk-tools-2.10.4-r2
scanelf-1.2.3-r0
musl-utils-1.1.22-r3
libc-utils-0.7.1-r0
binutils-2.32-r0
gmp-6.1.2-r1
isl-0.18-r0
libgomp-8.3.0-r0
libatomic-8.3.0-r0
libgcc-8.3.0-r0
mpfr3-3.1.5-r1
mpc1-1.1.0-r0
libstdc++-8.3.0-r0
gcc-8.3.0-r0
/ # apk stats
installed:
  packages: 24
  dirs: 125
  files: 866
  bytes: 96833536
  triggers: 1
available:
  names: 24063
  packages: 10336
atoms:
  num: 7245
/ # 

常見用法:apk add 二進制文件.apk
使用場景:下載至本地apk安裝文件,然後使用安裝文件進行安裝

常見用法:apk add --no-network 包名
使用場景:使用本地cache而不直接聯網進行安裝

常見用法:apk add --no-cache 包名
使用場景:不使用本地cache進行安裝,比如在Dockerfile中爲了避免生成cache產生無用的緩存安裝文件

常見用法:apk add gcc=8.3.0-r0
使用場景:安裝某包的指定版本(此示例爲使用apk安裝gcc的8.3.0-r0版本)

del

命令類別 子命令 命令說明
包管理 del 刪除指定包

以gcc的刪除爲例,可以看到連同安裝的其他依賴一同刪除,刪除示例日誌如下所示

/ # apk del gcc
(1/10) Purging gcc (8.3.0-r0)
(2/10) Purging binutils (2.32-r0)
(3/10) Purging libatomic (8.3.0-r0)
(4/10) Purging libgomp (8.3.0-r0)
(5/10) Purging mpc1 (1.1.0-r0)
(6/10) Purging mpfr3 (3.1.5-r1)
(7/10) Purging isl (0.18-r0)
(8/10) Purging gmp (6.1.2-r1)
(9/10) Purging libstdc++ (8.3.0-r0)
(10/10) Purging libgcc (8.3.0-r0)
Executing busybox-1.30.1-r2.trigger
OK: 6 MiB in 14 packages
/ # apk info
musl
busybox
alpine-baselayout
alpine-keys
libcrypto1.1
libssl1.1
ca-certificates-cacert
libtls-standalone
ssl_client
zlib
apk-tools
scanelf
musl-utils
libc-utils
/ # apk info |wc -l
14
/ # 

總結

Alpine作爲一個非常小巧的Docker鏡像,在很多場合得到了很好的應用,而apk作爲Alpine的包管理工具,隨着Alpine周遭生態的逐漸成熟,apk也發揮着越來越重要的作用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章