LoginSignup
2
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-10-31

はじめに

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

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

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0