はじめに
これは仕事中に試みたものの使わなくなった成果の供養記事です。
Railsを動かすべく、業務上やむなく検討したものの、まあ正気じゃないよねということで。
docker imageを作る作戦を立てる
まずCentOS6.8という時点でDockerHubにあるRuby公式イメージが使えない。
rubyをビルドするためにはrbenvが使えないのでrvmを使う必要がある
rvmを使うにはgitが必要であるが、yumで落とせるgitはgit1系でありもはや動かない。
gitの2系は https://ius.io/setup でrpmが2年前くらいまでは配布されていたが、今となってはCentOS6系のrpm配布は終了している。
gitをビルドするためにはgccが必要であるがyumで落とせるgccは古すぎてgitをビルドできない。
gccの最新は12.2.0であるが、これはyumで落とせるGNU ldが古すぎてリンクできない。
gccを11.2.0に下げるとリンクできるが、やはりyumで落とせるgccでは古すぎてビルドできない。
つまりgccの4.9系をビルドしてそれを用いてgccの11.2.0をビルドする必要がある。
gitはcurlに依存しているが、yumで落とせるcurlは古すぎてgitをビルドできない。よってcurlもビルドする必要がある。
その他にもこれらのライブラリがyumに無いので手でビルドする必要がある。
- xz-5.2.7
- libev-4.22
- jansson-2.14
- expat-2.5.0
できあがったもの
どうにかビルドした。
gccを2回もビルドするなかなかお目にかかれないファイルとなった。当然にしてビルドには猛烈に時間がかかるので、手元のつよつよ開発機をフルに使っても30分を超える時間がかかった。
FROM centos:6.8
ENV LANG ja_JP.UTF-8
ARG USERNAME=user
ARG GROUPNAME=user
ARG UID=1000
ARG GID=1000
RUN (echo 'ZONE="Asia/Tokyo"'; echo 'UTC=true') > /etc/sysconfig/clock && \
cp -p /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \
groupadd -g $GID $GROUPNAME && \
useradd -m -s /bin/bash -u $UID -g $GID $USERNAME && \
sed -i -e "s/^mirrorlist=http:\/\/mirrorlist.centos.org/#mirrorlist=http:\/\/mirrorlist.centos.org/g" /etc/yum.repos.d/CentOS-Base.repo && \
sed -i -e "s/^#baseurl=http:\/\/mirror.centos.org/baseurl=http:\/\/vault.centos.org/g" /etc/yum.repos.d/CentOS-Base.repo && \
sed -i -e '/override_install_langs/s/$/,ja_JP.utf8/g' /etc/yum.conf && \
yum -y update && \
yum check && \
locale -a
RUN yum -y install gcc-c++ libxml2 libxml2-devel libxslt libxslt-devel zlib-devel openssl-devel readline-devel curl-devel apr-devel apr-util-devel && \
cd /tmp && \
# xz
curl -LO https://tukaani.org/xz/xz-5.2.7.tar.gz && \
tar -xf xz-5.2.7.tar.gz && \
cd xz-5.2.7 && \
./configure && make -j $(nproc) && make install && /sbin/ldconfig || true && \
cd .. && \
rm xz-5.2.7.tar.gz && \
rm -rf xz-5.2.7 && \
# gcc 4.9.4
yum -y install wget && \
curl -LO http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-4.9.4/gcc-4.9.4.tar.gz && \
tar -xf gcc-4.9.4.tar.gz && \
cd gcc-4.9.4 && \
./contrib/download_prerequisites && \
cd .. && \
mkdir gcc-4.9.4-build && \
cd gcc-4.9.4-build && \
../gcc-4.9.4/configure \
-v --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu \
--prefix=/usr/local \
--enable-checking=release --enable-languages=c,c++ --disable-multilib --program-suffix=-4.9.4 && \
make -j $(nproc) && \
make install && \
/sbin/ldconfig || true && \
cd .. && \
rm gcc-4.9.4.tar.gz && \
rm -rf gcc-4.9.4 && \
rm -rf gcc-4.9.4-build && \
# gcc 11.2.0
curl -LO http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-11.2.0/gcc-11.2.0.tar.gz && \
tar -xf gcc-11.2.0.tar.gz && \
cd gcc-11.2.0 && \
./contrib/download_prerequisites && \
cd .. && \
ls -la && \
mkdir gcc-11.2.0-build/ && \
cd gcc-11.2.0-build && \
CC=gcc-4.9.4 CXX=g++-4.9.4 ../gcc-11.2.0/configure \
-v --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu \
--prefix=/usr/local \
--enable-checking=release --enable-languages=c,c++ --disable-multilib --program-suffix=-11.2 && \
make -j $(nproc) && \
make install && \
/sbin/ldconfig || true && \
cd /usr/local/bin/ && \
ln -s gcc-11.2 gcc && \
ln -s g++-11.2 g++ && \
cd /tmp && \
rm gcc-11.2.0.tar.gz && \
rm -rf gcc-11.2.0 && \
rm -rf gcc-11.2.0-build && \
# libev
curl -LO https://github.com/JiapengLi/libev/releases/download/v4.22/libev-4.22.tar.gz && \
tar -xf libev-4.22.tar.gz && \
cd libev-4.22 && \
./configure && make -j $(nproc) && make install && /sbin/ldconfig || true && \
cd .. && \
rm libev-4.22.tar.gz && \
rm -rf libev-4.22 && \
# jansson
curl -LO https://github.com/akheron/jansson/releases/download/v2.14/jansson-2.14.tar.gz && \
tar -xf jansson-2.14.tar.gz && \
cd jansson-2.14 && \
./configure && make -j $(nproc) && make install && /sbin/ldconfig || true && \
cd .. && \
rm jansson-2.14.tar.gz && \
rm -rf jansson-2.14 && \
# expat
curl -LO https://github.com/libexpat/libexpat/releases/download/R_2_5_0/expat-2.5.0.tar.xz && \
tar -xf expat-2.5.0.tar.xz && \
cd expat-2.5.0 && \
./configure && make -j $(nproc) && make install && /sbin/ldconfig || true && \
cd .. && \
rm expat-2.5.0.tar.xz && \
rm -rf expat-2.5.0 && \
# other
yum -y install flex libevent libunistring attr acl gettext && \
rm -rf /var/cache/yum/* && \
yum clean all
# curl
RUN cd /tmp && \
curl -LO https://github.com/curl/curl/releases/download/curl-7_86_0/curl-7.86.0.tar.xz && \
tar -xf curl-7.86.0.tar.xz && \
cd curl-7.86.0 && \
./configure --enable-libcurl-option --with-ssl=/usr --prefix=/usr --with-zlib && \
make -j $(nproc) && \
make install && \
/sbin/ldconfig || true && \
cd .. && \
rm curl-7.86.0.tar.xz && \
rm -rf curl-7.86.0 && \
# git
curl -LO https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.38.1.tar.xz && \
tar -xf git-2.38.1.tar.xz && \
cd git-2.38.1 && \
make configure && \
./configure --prefix=/usr --with-curl=/usr && \
make -j $(nproc) && \
make install && \
cd .. && \
rm git-2.38.1.tar.xz && \
rm -rf git-2.38.1 && \
cd /
余談
ちなみに今年はじめにCentOS5.7とかいう更に古い環境でどうしてもgitを新しくする必要があり、似たようなことをしていた。このときはhttps通信がOpenSSLやら証明書の関係で使えないものだから、手元のマシーンで必要なものは落としてrsyncでねじ込むというすさまじい苦行を強いられた。それを思えば遥かに楽であった。
にしても大学時代も大学の学内環境のgitの古さに耐えかねてビルドした(disk容量不足で頓挫)ことがあるし、どうも私はgitをビルドする運命にあるのだろうか。