centos6.8で最新のgitを使おうとするDockerfileを書くなんて今更佳代 

# はじめに

これは仕事中に試みたものの使わなくなった成果の供養記事です。

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分を超える時間がかかった。

```dockerfile
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をビルドする運命にあるのだろうか。

https://yumetodo.hateblo.jp/entry/2017/07/01/123416