DockerでCentOS 7のベースイメージを作ってPerl環境があるイメージ作る

CentOS7からは特に何もしなくてもDockerをyumから入れられるようなので、難しい事は考えずに試しました。

以下を参考にしました。以下を読めばこの記事を読む必要は無いと思います。

CentOS7のベースイメージを作る

yum でgroupinstall Coreすると出来るそうです。

# ベースイメージの作成先
sudo mkdir /var/tmp/centos7

# ベースイメージを作るためのyumの設定ファイル
sudo mkdir /var/tmp/centos7-config

# yumで使う設定ファイルを作る。
# 変数になっている箇所を置き換える必要があったので、置き換える。
cat /etc/yum.repos.d/CentOS-Base.repo \
| sed -e 's/$basearch/x86_64/g' -e 's/$releasever/7/g' \
| sudo tee /var/tmp/centos7-config/yum.conf

# 作った設定を使ってベースイメージの作成先にパッケージをインストールする
sudo yum -c /var/tmp/centos7-config/yum.conf --installroot=/var/tmp/centos7 -y groupinstall Core

#デバイスファイルを作る
cd /var/tmp/centos7/dev

# nullがなぜかファイルとして存在したので削除しておく。
sudo rm null
# nullデバイス. 書き込み処理を無視する。
sudo mknod -m 666 null c 1 3
# zeroを出力するためのデバイス
sudo mknod -m 666 zero c 1 5
# 乱数を生成するデバイス. 充分に環境ノイズがないとそれが集まるまでブロックする
sudo mknod -m 666 random c 1 8
# randomと比べ低品質だがブロックしない乱数を生成するデバイス
sudo mknod -m 666 urandom c 1 9
# 擬似端末マスタの対になる擬似端末スレーブのファイルディスクリプタを作る先
sudo mkdir -m 755 pts
# 共有メモリ マウントポイント作成
sudo mkdir -m 1777 shm
# 自身の端末を意味するデバイス。SSHなら/dev/pts/0とか指す
sudo mknod -m 666 tty c 5 0
# 仮想端末を指すデバイスファイル。以下の仮想端末の中でアクティブになってる仮想端末を指すショートカットらしい。
sudo mknod -m 666 tty0 c 4 0
# 実マシン上でCtrl+ALT+[F1,F2]とかやると端末が切り替わる。そのときの仮想端末を指すデバイスファイル。
sudo mknod -m 666 tty1 c 4 1
# システムメッセージを送る先になるコンソール。今はたいていtty0と同じ。よくわからない。
sudo mknod -m 600 console c 5 1
# 書き込みに必ず失敗するデバイスファイル
sudo mknod -m 666 full c 1 7
# 擬似端末マスタを作るやつ
sudo mknod -m 666 ptmx c 5 2

dockerインストール

パッケージからいれます。

sudo yum install docker
sudo systemctl enable docker.service
sudo systemctl start docker.service

ベースイメージをインポート

cd /var/tmp/centos7
sudo tar -c . | sudo docker import - ryozi/centos7

imagesするとインポートしたイメージが追加されている。

sudo docker images

ベースイメージを元にperl環境を持つベースイメージを作る

難しい事はわからないので、バージョンは5.20.0で固定にして、https://github.com/miyagawa/docker-plenv-vanilla をちょっと修正して使ってます。

# 適当にディレクトリを作る
cd ~
mkdir -p works/docker/plenv
cd works/docker/plenv

# Dockerファイルの作成。ベースイメージにさっきのものを指定
cat <<'__EOF__' > Dockerfile
FROM ryozi/centos7

RUN yum update -y

RUN yum install -y git bzip2 patch gcc make

RUN git clone git://github.com/tokuhirom/plenv.git /root/.plenv
RUN git clone git://github.com/tokuhirom/Perl-Build.git /root/.plenv/plugins/perl-build/
ADD ./plenv.sh /etc/profile.d/plenv.sh

RUN . /etc/profile; MAKEFLAGS="-j 5" plenv install 5.20.0
RUN . /etc/profile; plenv local 5.20.0
RUN . /etc/profile; plenv install-cpanm
RUN . /etc/profile; cpanm install Carton
__EOF__

# 拝借
curl -O https://raw.githubusercontent.com/miyagawa/docker-plenv-vanilla/master/plenv.sh

名前をつけてビルド

sudo docker build -t ryozi/plenv ./

出来上がり

imagesするとビルドしたイメージが追加されている。

sudo docker images

実行する。後始末が面倒なので、--rmオプションをつけてる。

sudo docker run --rm ryozi/plenv bash -lc "perl -V"

bashの-lオプションがないと/etc/profileを読んでくれないのでつけている。 bash -c ". /etc/profile; perl -V";でも良いけども。