re:inventing the wheel

それでも車輪は回っている

CentOS7のDocker Imageを自作する

これまでCentOSでdockerイメージをを自作する際は、febootstrapというコマンドを利用していましたが、 CentOS7ではepelからもパッケージがなくなっていたので調べてみました。

febootstrapからsuperminに変更された

背景までは調べていませんが、このページを見ると febootstrapはsuperminに変わったようです。

This tool was formerly known as febootstrap.

CentOS7にsuperminをインストールする

参考にしたページにも書いてありますが、 yumのパッケージはバージョンが古いためソースから5.1.11をインストールしました。
※yumでは4.14でオプションがかなり異なります。

先ずはREADMEに従い、コンパイルに必要な環境をパッケージからインストールします。

1
# yum install gcc gawk ocaml ocaml-findlib perl-Pod-Perldoc e2fsprogs e2fsprogs-devel e2fsprogs-libs e2fsprogs-static glibc-static yum-utils rpm-devel

なお、READMEには記載されていませんでしたが、RPM系の環境用にコンパイルする場合、rpm-develを インストールしておかないとsupermin --prepare時に以下のエラーメッセージで処理が止まってしまいます。

1
2
3
4
5
6
7
8
9
10
11
12
# /usr/local/bin/supermin --prepare yum -o supermin.d
supermin: could not detect package manager used by this system or distro.

If this is a new Linux distro, or not Linux, or a Linux distro that uses
an unusual packaging format then you may need to port supermin.  If
you are expecting that supermin should work on this system or distro
then it may be that the package detection code is not working.

To list which package handlers are compiled into this version of
supermin, do:

supermin --list-drivers

コンパイルとインストールは一般的ですが、以下の手順で行います。

1
2
3
4
5
6
7
# cd /usr/local/src
# wget http://libguestfs.org/download/supermin/supermin-5.1.11.tar.gz
# tar xvzf supermin-5.1.11.tar.gz
# cd supermin-5.1.11
# ./configure
# make
# make install

インストールが終わったら、念のため以下のコマンドを確認してください。

1
2
3
4
5
6
# /usr/local/bin/supermin --list-drivers
arch/pacman     not-detected
debian/dpkg     not-detected
mageia/rpm      not-detected
opensuse/rpm    not-detected
fedora/rpm      detected

出力にfedora/rpm detectedがあれば大丈夫です。

CentOS7のDocker Imageの作成

こちらの記事を参考に、chrootイメージを作成します。

1
2
# /usr/local/bin/supermin --prepare yum -o supermin.d
# /usr/local/bin/supermin --build --format chroot supermin.d -o appliance.d
1
2
3
4
5
6
7
8
# cd appliance.d
# mv usr/share/locale/en usr/share/locale/en_US tmp
# rm -rf usr/share/locale/*
# mv tmp/en tmp/en_US usr/share/locale/
# mv usr/share/i18n/locales/en_US tmp
# rm -rf usr/share/i18n/locales/*
# mv tmp/en_US usr/share/i18n/locales/
# cd ..

上記で作成すると $releasever がうまく取得できず、yumが動かなかったのでもう一手間加えます。

1
2
3
# cd appliance.d
# echo 7 > etc/yum/vars/releasever
# cd ..

dockerイメージにするため、tarで固めます。
xz形式で圧縮するのが一般的なようなので、以下のようにします。

1
# tar --numeric-owner -Jcpf centos7-zero.tar.xz -C appliance.d .

今回利用した docker 1.3.2 ではdocker importに問題があるようなので圧縮なしで作成しました。

1
# tar --numeric-owner -cpf centos7-zero.tar -C appliance.d .

ちなみに、1.3.2にインストールすると以下のエラーになります。

1
2
# cat centos7-zero.tar.xz | docker import - local/centos7-zero
2015/01/15 09:37:45 Error: ApplyLayer exit status 1 exec: "xz": executable file not found in $PATH

作成したイメージをdockerにインポートする

以下のコマンドで、docker imageとしてimportします。
※本来であれば、xz形式でもdocker importが解いてくれます。

1
# cat centos7-zero.tar | docker import - local/centos7-zero

以下のようにして、イメージが登録されたことを確認します。

1
2
3
# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
local/centos7-zero   latest              cb1d0872e89a        45 minutes ago      136.4 MB

その他

上記手順で作成したイメージは大変シンプルでdocker向きですが、本当に何もパッケージが入っていないです。 そこで、centosのオフィシャルイメージにインストールされていたパッケージからsupermin --prepareを書いてみました。

1
# /usr/local/bin/supermin --prepare audit-libs basesystem bash binutils bzip2-libs ca-certificates centos-release chkconfig coreutils cpio cracklib cracklib-dicts curl cyrus-sasl-lib dbus-libs device-mapper device-mapper-libs diffutils elfutils-libelf expat fakesystemd file file-libs filesystem findutils gawk gdbm glib2 glibc glibc-common gmp gnupg2 gpgme grep groff-base gzip hardlink info iproute iptables iptables-services iputils keyutils-libs kmod-libs kpartx krb5-libs less libacl libassuan libattr libblkid libcap libcap-ng libcom_err libcroco libcurl libdb libdb-utils libffi libgcc libgcrypt libgomp libgpg-error libidn libmnl libmount libnetfilter_conntrack libnfnetlink libpwquality libselinux libsemanage libsepol libssh2 libstdc++ libtasn1 libunistring libuser libutempter libuuid libverto libxml2 lua ncurses ncurses-base ncurses-libs nspr nss nss-softokn nss-softokn-freebl nss-sysinit nss-tools nss-util openldap openssl-libs p11-kit p11-kit-trust pam pcre pinentry pkgconfig popt procps-ng pth pygpgme pyliblzma python python-iniparse python-libs python-pycurl python-urlgrabber pyxattr readline rootfiles rpm rpm-build-libs rpm-libs rpm-python sed setup shadow-utils shared-mime-info sqlite systemd-libs tzdata ustr util-linux vim-minimal which xz xz-libs yum yum-metadata-parser yum-plugin-fastestmirror zlib -o supermin.d

また、必要であればDockerfileを使って、Minimal Installしても良いと思います。

1
2
3
4
5
6
7
8
# CentOS7 Minimal Install Image
#
# VERSION 20150115

FROM       local/centos7-zero
MAINTAINER Yosuke Yamamoto

RUN yum -y groupinstall "Minimal Install"; yum clean

この辺りは、使用場面によっても異なってくると思うので深く追求はしません。

参考


以上です。