SLコマンドをコンテナビルド

技術記事

前置き

 まず、SLコマンドとは、ターミナル画面上にSLが走るジョークプログラムです。昨今のPCでlsコマンドをslと打ち間違えても、エラーの反応結果が得られるまですごく時間がかかるわけではないので、必要性がありません。しかし、大昔のPC性能で同じように行った場合は、反応結果が得られるまで時間がかかりました。そのため、エラー処理時間を短縮されるため用意されたコマンドがslコマンドです。

 今回はコンテナ上でのC言語ビルドのやり方やビルドと実行環境のコンテナを分けて実行することで、容量を抑えたコンテナを作る方法を学ぶ上に役に立つと思い記載しました。

作成概要

 作成イメージについて以下の図に示します。本記事では実行用のコンテナを容量を少なくするため、実行環境とSLコマンドをビルドするためのコンテナを分け、容量が少ないコンテナイメージを用意します。

ビルド環境のDockerfile作成

コンテナ上コマンドテスト

 今回は、ここにアップロードされているソースファイルをビルドし、slコマンドを作成します。以下のコマンドを実行して、ベースとなるコンテナ(ubuntu:18.04)を起動し、その中でビルドできるかテストします。

docker run -it ubuntu:18.04 /bin/bash

 コンテナ内に入りましたら、ソースコードをGitHubからダウンロードするために必要な、gitコマンドをインストールし、そのコマンドを使用してソースコードのダウンロードを行い、ソースコードをビルドできるようにするフォルダに入ります。

 上記の内容を以下コマンド入力で実行します。

apt update
apt install -y git
git clone https://github.com/mtoyoda/sl
cd sl

次に、makeコマンドを実行することで、ソースコードをビルドします。

makeコマンドを入力するとデフォルトのままでは、コマンドが見つからないと表示されます。

# make
bash: make: command not found

この問題を解決させるために、makeコマンドをインストールします。

apt install -y make

makeコマンドインストール後、makeコマンドを実行すると次は、gccコマンドが見つからないと表示されます。

# make
gcc -O -Wall -o sl sl.c -lncurses
make: gcc: Command not found
Makefile:15: recipe for target 'sl' failed
make: *** [sl] Error 127

同じように、gccコマンドをインストールします。

apt install -y gcc

gccコマンドインストール後、makeコマンドを実行すると、今度はcurses.hライブラリが存在しないというエラーが表示されます。

# make
gcc -O -Wall -o sl sl.c -lncurses
sl.c:41:10: fatal error: curses.h: No such file or directory
 #include <curses.h>
          ^~~~~~~~~~
compilation terminated.
Makefile:15: recipe for target 'sl' failed
make: *** [sl] Error 1

curses.hライブラリをインストールするため、libncurses5-devを導入します。

apt install -y libncurses5-dev

導入後makeコマンドを実行するとエラーが表示されません。

# make
gcc -O -Wall -o sl sl.c -lncurses

同フォルダ内にslという名のファイル名が新しくできているので、そのコマンドを以下のように実行します。

./sl

コマンド実行すると、画面にアスキーアートでSLが走ることを確認できます。

Dockerfile作成

以上の流れを一つのDockerfileにまとめると以下の通りになります。

Dockerfile

FROM ubuntu:18.04
RUN apt update
RUN apt install -y git make gcc libncurses5-dev
WORKDIR /
RUN git clone https://github.com/mtoyoda/sl
WORKDIR /sl
RUN make
RUN mv sl /usr/local/bin

以下のコマンドでビルドすると、301MBのコンテナファイルが作成されます。

docker build -t testsl .

以下のコマンドでslコマンドのテストができます。

docker run -it testsl sl

低容量コンテナ作成

 コンテナの容量が301MBでは多いためベースコンテナにビルド成果物だけ追加したコンテナを作るDockerfileファイルの内容は以下に示します。

FROM ubuntu:18.04 AS builder
RUN apt update
RUN apt install -y git make gcc libncurses5-dev
WORKDIR /
RUN git clone https://github.com/mtoyoda/sl
WORKDIR /sl
RUN make
FROM ubuntu:18.04
COPY --from=builder /sl/sl /usr/local/bin

 以下のコマンドを実行してビルドしますと、64.2MBのコンテナファイルをが作成されます

docker build -t slcmd.

作成したあとで、以下のコマンドを実行すればslコマンドのテストができます。

docker run -it slcmd sl

実行しますと以下のようなアスキーアートが画面に表示されます。