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に入っていることがわかる。
インストールする
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) してくれる。
なぜそんな設計にしたのか、不思議だ。