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で使えるパッケージは下記で探せる。
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) してくれる。
なぜそんな設計にしたのか、不思議だ。