前置き
まず、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
実行しますと以下のようなアスキーアートが画面に表示されます。