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版本)
注:包的版本可以从如下链接进行查询
https://pkgs.alpinelinux.org/
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也发挥着越来越重要的作用。