モヒカンは正義

渋谷で働く怪しいWebエンジニアの生きた証と備忘録

AlpineLinuxでdigコマンドを使えるようにする

Dockerイメージを作る際のベースイメージとしてよく使われるOSに AlpineLinux がある。超軽量なのが特徴で、イメージサイズはわずか4MByte強!参考までに、CentOS7.4のイメージは約200MBある。

$ docker images alpine
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
alpine              latest              3fd9065eaf02        4 months ago        4.15MB
$ docker images centos
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              e934aafc2206        8 weeks ago         199MB

そんなAlpineLinuxでdigコマンドを使いたくなったが、当然のように入っていなかった。

/ # dig
sh: dig: not found

パッケージの探しかた

AlpineLinuxで使えるパッケージは下記で探せる。

Alpine Linux packages

file欄に dig と入力して検索すると、下記のとおり bind-tools というpackageに入っていることがわかる。

f:id:pinkumohikan:20180602153721p:plain

インストールする

AlpineLinuxのパッケージマネージャは apk

Alpine Linux package management - Alpine Linux

apk is the tool used to install, upgrade, or delete software on a running sytem.

bind-tools パッケージをインストールする場合、下記のようなコマンドとなる。

apk add --no-cache bind-tools

--no-cache を指定している理由は、最下部の補足を参照

実行結果

/ # apk add --no-cache bind-tools
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/community/x86_64/APKINDEX.tar.gz
(1/3) Installing libgcc (6.4.0-r5)
(2/3) Installing bind-libs (9.11.3-r0)
(3/3) Installing bind-tools (9.11.3-r0)
Executing busybox-1.27.2-r7.trigger
OK: 21 MiB in 35 packages

インストールが終わると、digコマンドが使えるようになる。

/ # dig

; <<>> DiG 9.11.3 <<>>
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 22199
;; flags: qr rd ra; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;.              IN  NS

;; ANSWER SECTION:
.           57071   IN  NS  a.root-servers.net.
.           57071   IN  NS  b.root-servers.net.
.           57071   IN  NS  c.root-servers.net.
.           57071   IN  NS  d.root-servers.net.
.           57071   IN  NS  e.root-servers.net.
.           57071   IN  NS  f.root-servers.net.
.           57071   IN  NS  g.root-servers.net.
.           57071   IN  NS  h.root-servers.net.
.           57071   IN  NS  i.root-servers.net.
.           57071   IN  NS  j.root-servers.net.
.           57071   IN  NS  k.root-servers.net.
.           57071   IN  NS  l.root-servers.net.
.           57071   IN  NS  m.root-servers.net.

;; Query time: 11 msec
;; SERVER: 127.0.0.11#53(127.0.0.11)
;; WHEN: Fri Jun 01 13:25:43 UTC 2018
;; MSG SIZE  rcvd: 239

めでたしめでたし

補足

例示のインストールコマンドは、Dockerfile内で叩くことを想定して可能な限りサイズが小さくなるように --no-cache を指定している。

「Dockerfile内から叩くわけじゃないし --no-cache していしなくていっかー」と思った人に読んで欲しいが、 apk add コマンドはインストール対象のパッケージ情報をローカルのpackage indexから検索しようとする。そのため、いきなり apk add bind-tools と叩くと下記のように「bind-tools?知らない人ですね」とエラーになってしまう。

/ # apk add bind-tools
WARNING: Ignoring APKINDEX.70c88391.tar.gz: No such file or directory
WARNING: Ignoring APKINDEX.5022a8a2.tar.gz: No such file or directory
ERROR: unsatisfiable constraints:
  bind-tools (missing):
    required by: world[bind-tools]

そういうときは、 apk add を叩く前に apk update を叩いて、package indexを更新しておく。

/ # apk update && apk add bind-tools
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/community/x86_64/APKINDEX.tar.gz
v3.7.0-190-g3da66f61a4 [http://dl-cdn.alpinelinux.org/alpine/v3.7/main]
v3.7.0-184-ge62f3c3781 [http://dl-cdn.alpinelinux.org/alpine/v3.7/community]
OK: 9054 distinct packages available
(1/4) Installing libgcc (6.4.0-r5)
(2/4) Installing libxml2 (2.9.7-r0)
(3/4) Installing bind-libs (9.11.3-r0)
(4/4) Installing bind-tools (9.11.3-r0)
Executing busybox-1.27.2-r7.trigger
OK: 9 MiB in 15 packages

ここまで読むと「例示のコマンドでは apk update なんて書いて無かったじゃないか」と思うかもしないが、実はそれで良くて、apk add--no-cache オプションをつけておくと、勝手に apk update したあとに apk add を実行し、最後にpackage indexをclean (rm) してくれる。 なぜそんな設計にしたのか、不思議だ。