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也發揮着越來越重要的作用。