Alpine Linuxのapkコマンドでインストールする可能なパッケージを検索する方法

Bash, Docker, Linux

はじめに

dig コマンドや nmap をつかって、サーバの外部からの見え方を調査する必要がありました。
軽量でクリーンなLinux環境がほしかったので、 Alpine Linux を使ってみたのですが、パッケージの探し方について yumapt との違いが理解できていませんでした。

特に導入したいコマンドを含むパッケージをどうやって探すかについて知らなかったので調べてみました。

検証環境

$ uname -moi
x86_64 MacBookPro11,4 Darwin
$ docker --version
Docker version 19.03.5, build 633a0ea

まずは \"Alpine Linux\" の起動

docker コマンドを使って、 \"Alpine Linux\" を起動します。
以下のコマンドを実行すれば初回実行時のみ、 \"Docker Hub\" からイメージファイルがダウンロードされます。
ダウンロードが完了していれば、直ちに \"Alpine Linux\" コンテナが起動し、ログイン済み状態となります。

$ docker run -i -t --rm alpine
/ #

インストール可能なパッケージをWebから検索する方法

\"Alpine Linux\" で使えるパッケージは Alpine Linux packages というサイトから検索できる。

\"File\" という入力エリアに dig を入力して \"Search\" ボタン を押します。

bind-tools というパッケージをインストールすれば良いことがわかります。

インストール可能なパッケージをコマンドから検索する方法

apk コマンドのヘルプを確認します。

--verbose オプションを付与しないと利用できるすべてのコマンドが出力されません。

$ apk --help --verbose
apk-tools 2.10.4, compiled for x86_64.
usage: apk COMMAND [-h|--help] [-p|--root DIR] [-X|--repository REPO] [-q|--quiet] [-v|--verbose] [-i|--interactive] [-V|--version] [-f|--force] [--force-binary-stdout] [--force-broken-world] [--force-non-repository] [--force-old-apk] [--force-overwrite] [--force-refresh]
           [-U|--update-cache] [--progress] [--progress-fd FD] [--no-progress] [--purge] [--allow-untrusted] [--wait TIME] [--keys-dir KEYSDIR] [--repositories-file REPOFILE] [--no-network] [--no-cache] [--cache-dir CACHEDIR] [--cache-max-age AGE] [--arch ARCH] [--print-arch]
           [ARGS]...
The following commands are available:
  add       Add PACKAGEs to 'world' and install (or upgrade) them, while ensuring that all dependencies are met
  del       Remove PACKAGEs from 'world' and uninstall them
  fix       Repair package or upgrade it without modifying main dependencies
  update    Update repository indexes from all remote repositories
  info      Give detailed information about PACKAGEs or repositories
  list      List packages by PATTERN and other criteria
  search    Search package by PATTERNs or by indexed dependencies
  upgrade   Upgrade currently installed packages to match repositories
  cache     Download missing PACKAGEs to cache and/or delete unneeded files from cache
  version   Compare package versions (in installed database vs. available) or do tests on literal version strings
  index     Create repository index file from FILEs
  fetch     Download PACKAGEs from global repositories to a local directory
  audit     Audit the directories for changes
  verify    Verify package integrity and signature
  dot       Generate graphviz graphs
  policy    Show repository policy for packages
  stats     Show statistics about repositories and installations
  manifest  Show checksums of package contents
...(省略)...

apk search コマンドのヘルプを確認してみます。

$ apk search --help
apk-tools 2.10.4, compiled for x86_64.
usage: apk search [-h|--help] [-p|--root DIR] [-X|--repository REPO] [-q|--quiet] [-v|--verbose] [-i|--interactive] [-V|--version]
           [-f|--force] [--force-binary-stdout] [--force-broken-world] [--force-non-repository] [--force-old-apk] [--force-overwrite]
           [--force-refresh] [-U|--update-cache] [--progress] [--progress-fd FD] [--no-progress] [--purge] [--allow-untrusted]
           [--wait TIME] [--keys-dir KEYSDIR] [--repositories-file REPOFILE] [--no-network] [--no-cache] [--cache-dir CACHEDIR]
           [--cache-max-age AGE] [--arch ARCH] [--print-arch] [-a|--all] [-d|--description] [-x|--exact] [-o|--origin] [-r|--rdepends]
           [--has-origin] PATTERN
...(省略)...

apk search を使ってパッケージを検索する

早速、 dig コマンドが内包されているパッケージを探してみます。
( 先程もWebから検索した結果からわかるとおり、 apk では bind-tools というパッケージに dig コマンドが内包されていました。 )

$ apk search dig
WARNING: Ignoring APKINDEX.00740ba1.tar.gz: No such file or directory
WARNING: Ignoring APKINDEX.d8b2a6f4.tar.gz: No such file or directory

警告が表示されてしまいました。
apk search コマンドを利用するためには、一度 apk update してパッケージ情報を更新する必要があるようです。

$ 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.3-53-g367286011b [http://dl-cdn.alpinelinux.org/alpine/v3.10/main]
v3.10.3-51-gf4a3cffc34 [http://dl-cdn.alpinelinux.org/alpine/v3.10/community]
OK: 10343 distinct packages available
$ apk search dig
syncthing-utils-1.0.1-r0
perl-digest-sha1-doc-2.13-r10
perl-digest-hmac-1.03-r0
apache2-utils-2.4.41-r0
texlive-20190410-r1
perl-digest-md5-doc-2.55-r3
ntpsec-1.1.3-r1
vis-0.5-r0
perl-digest-md5-2.55-r3
perl-digest-sha1-2.13-r10
pdns-tools-4.1.11-r0
bind-tools-9.14.7-r0
cyrus-sasl-digestmd5-2.1.27-r3
xapian-omega-1.4.11-r1
libselinux-utils-2.8-r0
knot-utils-2.8.2-r0
rt4-4.4.4-r0
perl-digest-hmac-doc-1.03-r0
perl-digest-bubblebabble-doc-0.02-r2
heimdal-libs-7.5.0-r5
nagios-plugins-dig-2.2.1-r6
perl-digest-bubblebabble-0.02-r2
perl-digest-perl-md5-1.9-r1
perl-digest-perl-md5-doc-1.9-r1
freeradius-3.0.20-r1

bind-tools が検索結果として見つかりましたね。めでたしめでたし(と言いたいところですが、結果が見にくいですね^^;)。

apk search の検索結果をもう少し詳しく・見やすくする

このままだとどのパッケージが最適かわかりにくいため、 --verbose オプションを付与します。

$ apk search --verbose dig
syncthing-utils-1.0.1-r0 - Syncthing utilities
perl-digest-sha1-doc-2.13-r10 - Perl interface to the SHA-1 algorithm (documentation)
perl-digest-hmac-1.03-r0 - Keyed-Hashing for Message Authentication Perl module
apache2-utils-2.4.41-r0 - Apache utility programs for webservers
texlive-20190410-r1 - Comprehensive TeX document production system
perl-digest-md5-doc-2.55-r3 - Perl interface to the MD-5 algorithm (documentation)
ntpsec-1.1.3-r1 - NTP reference implementation, refactored for security
vis-0.5-r0 - Modern, legacy free, simple yet efficient vim-like editor
perl-digest-md5-2.55-r3 - Perl interface to the MD-5 algorithm
perl-digest-sha1-2.13-r10 - Perl interface to the SHA-1 algorithm
pdns-tools-4.1.11-r0 - PowerDNS Authoritative Server
bind-tools-9.14.7-r0 - The ISC DNS tools
cyrus-sasl-digestmd5-2.1.27-r3 - Cyrus SASL plugin for digestmd5
xapian-omega-1.4.11-r1 - Indexers and CGI search frontend for Xapian
libselinux-utils-2.8-r0 - SELinux libselinux utilies
knot-utils-2.8.2-r0 - DNS client utilities shipped with the Knot DNS server
rt4-4.4.4-r0 - Request Tracker - issue and bug tracker
perl-digest-hmac-doc-1.03-r0 - Keyed-Hashing for Message Authentication Perl module (documentation)
perl-digest-bubblebabble-doc-0.02-r2 - Create bubble-babble fingerprints (documentation)
heimdal-libs-7.5.0-r5 - Heimdal libraries
nagios-plugins-dig-2.2.1-r6 - Nagios plugin check_dig
perl-digest-bubblebabble-0.02-r2 - Create bubble-babble fingerprints
perl-digest-perl-md5-1.9-r1 - Perl Implementation of Rivest's MD5 algorithm
perl-digest-perl-md5-doc-1.9-r1 - Perl Implementation of Rivest's MD5 algorithm (documentation)
freeradius-3.0.20-r1 - RADIUS (Remote Authentication Dial-In User Service) server

少しだけ加工してやることで随分見やすくなります。

$ apk search --verbose dig \\
   | sed "s/ - /,/" | while IFS=, read -r P O; do
     printf "%-50s\\t%s\\n" "${P}" "${O}"
   done
syncthing-utils-1.0.1-r0                                Syncthing utilities
perl-digest-sha1-doc-2.13-r10                           Perl interface to the SHA-1 algorithm (documentation)
perl-digest-hmac-1.03-r0                                Keyed-Hashing for Message Authentication Perl module
apache2-utils-2.4.41-r0                                 Apache utility programs for webservers
texlive-20190410-r1                                     Comprehensive TeX document production system
perl-digest-md5-doc-2.55-r3                             Perl interface to the MD-5 algorithm (documentation)
ntpsec-1.1.3-r1                                         NTP reference implementation, refactored for security
vis-0.5-r0                                              Modern, legacy free, simple yet efficient vim-like editor
perl-digest-md5-2.55-r3                                 Perl interface to the MD-5 algorithm
perl-digest-sha1-2.13-r10                               Perl interface to the SHA-1 algorithm
pdns-tools-4.1.11-r0                                    PowerDNS Authoritative Server
bind-tools-9.14.7-r0                                    The ISC DNS tools
cyrus-sasl-digestmd5-2.1.27-r3                          Cyrus SASL plugin for digestmd5
xapian-omega-1.4.11-r1                                  Indexers and CGI search frontend for Xapian
libselinux-utils-2.8-r0                                 SELinux libselinux utilies
knot-utils-2.8.2-r0                                     DNS client utilities shipped with the Knot DNS server
rt4-4.4.4-r0                                            Request Tracker - issue and bug tracker
perl-digest-hmac-doc-1.03-r0                            Keyed-Hashing for Message Authentication Perl module (documentation)
perl-digest-bubblebabble-doc-0.02-r2                    Create bubble-babble fingerprints (documentation)
heimdal-libs-7.5.0-r5                                   Heimdal libraries
nagios-plugins-dig-2.2.1-r6                             Nagios plugin check_dig
perl-digest-bubblebabble-0.02-r2                        Create bubble-babble fingerprints
perl-digest-perl-md5-1.9-r1                             Perl Implementation of Rivest's MD5 algorithm
perl-digest-perl-md5-doc-1.9-r1                         Perl Implementation of Rivest's MD5 algorithm (documentation)
freeradius-3.0.20-r1                                    RADIUS (Remote Authentication Dial-In User Service) server

ひとこと

apk search のオプションの使い方がよくわからないです。
apk search -x で厳密な(部分一致ではない)パターン検索の挙動になることはわかったのですが、その他のオプションが効いているのか効いていないのか、実行結果に変化がないんですね。

Bash, Docker, Linux