DockerでRPMを作る – オレオレアドベントカレンダー3日目
Dockerでrpm imageを作りたい
RPM作るの面倒ですよね。環境揃えたり。でも、Dokerなら簡単にできるのでおすすめです。
Docker環境の準備
Ubuntuでも何でも良いので、Docker入れてdocker run hello-world できるようにしときましょう。で、以下のディレクトリを作っておきます
$ mkdir RPMS SRPMS BUILD BUILDROOT SPECS
Dockerfileの準備
以下のDockerfileを用意します。
必要なyumリポジトリがあれば、追加しておきましょう。
FROM centos:7
RUN \
yum install -y epel-release && \
yum install -y http://rpms.famillecollet.com/enterprise/remi-release-7.rpm && \
yum update -y && \
yum install -y gcc gcc-c++ \
libtool libtool-ltdl \
make cmake \
git \
pkgconfig \
sudo \
automake autoconf \
yum-utils rpm-build rpmdevtools && \
yum clean all && \
useradd builder -u 1000 -m -G users,wheel && \
echo "builder ALL=(ALL:ALL) NOPASSWD:ALL" >> /etc/sudoers && \
echo "# macros" > /home/builder/.rpmmacros && \
echo "%_topdir /rpmbuild" >> /home/builder/.rpmmacros && \
echo "%_buidroot /rpmbuild/BUILDROOT" >> /home/builder/.rpmmacros && \
mkdir -p /rpmbuild/SPECS && \
mkdir -p /rpmbuild/RPMS && \
mkdir -p /rpmbuild/SRPMS && \
mkdir -p /rpmbuild/BUILD && \
mkdir -p /rpmbuild/BUILDROOT && \
chown -R builder /home/builder && \
chown -R builder /rpmbuild
USER builder
ENV RPMNAME=rpm
ENV FLAVOR=rpmbuild OS=centos DIST=el7
CMD spectool -g -R /rpmbuild/SPECS/${RPMNAME}.spec && \
sudo yum-builddep -y --enablerepo=remi \
/rpmbuild/SPECS/${RPMNAME}.spec && \
rpmbuild -ba /rpmbuild/SPECS/${RPMNAME}.spec
このDockerfileで、rpmbuild というdocker imageをビルドしましょう。
$ docker build ./ -t rpmbuild
RPMを作る
SPECディレクトリにspecファイルを、SOURCESに、独自のファイルが有れば配置しましょう。specファイルのすべてのソースがネット経由で取得する設定であれば、SOURSESに何も配置する必要はありませんし、BuildRequireにあるパッケージは自動的にインストールされます。
あとは、以下のようにコマンドを打つだけです。
$ docker run -r --rm -v ./:/rpmbuild -e RPMNAME=RPM名 rpmbuild:latest
これで、RPMS以下にrpmファイルが、SRPM以下にsrpmファイルが作成されるはずです。標準出力にログが残るので、teeなどでファイルにとっておくことをお勧めします。
ね、簡単でしょ?
このように、RPMは簡単にできます。みなさんも自分のRPMくらいは自分で作りましょう。エンジニアなら、自分のパッケージレポジトリの1つや2つ持っているものですよね?