at_shinya.matsumoto
2023年3月24日 15時58分
本ブログはArmadillo Base OSでDockerfileを用いて、コンテナ作成からパッケージインストールや
アプリのビルド等を一括処理で行う方法を紹介します。
Dockerfileを使用するメリット
・パッケージのインストールやファイル等の作成/コピー等を一括で実行できる
⇒コンテナを作って一つ一つコマンドを打つ必要がない
・実運用には不要なビルドツールを取り込まずにイメージを作れる(イメージの軽量化)
⇒コンテナはレイヤー構造になっており後でビルドツールを削除してもイメ―ジを軽量化出来ない
本ブログで実施する事
1.Dockerfileとアプリ(ここではhello world)のC言語ソースファイルを準備
2.DockerfileでコンテナイメージA,Bを作成
⇒コンテナイメージAはビルド環境用のイメージ(こちらは後で削除)
コンテナイメージBはビルドツールを除いて軽量化した完成版イメ―ジ
実施手順
1.Dockerfileとアプリ(ここではhello world)のC言語ソースファイルを準備
最初に以下のDockerfileを作成します。書式はこちらを参照下さい。
[armadillo]# cat Dockerfile
#--------コンテナイメージA作成------------
#使用するコンテナイメージを記載する(A6Eの場合はarch=armv7と指定する)
#実際に使用するArmadillo本体で実行する場合は${arch}は省略も可能
#ここではコンテナイメージAを"tmp_image"とする
ARG arch=arm64v8
FROM docker.io/${arch}/debian:bullseye As tmp_image
#コンテナ内にファイルをコピーする
#ここではDockerfileと同階層にある”hello.c”をコンテナ内の”/root/”にコピー
COPY hello.c /root/
#コンテナ内で実行するコマンドを記載する
#ここではコンパイルツールをインストールし、コンパイルまで行う
RUN apt update && apt upgrade -y
RUN apt install build-essential -y
RUN cd && gcc -o hello.exe hello.c
#--------コンテナイメージB作成------------
#コンテナイメージBと同じコンテナイメージを使用する
FROM docker.io/${arch}/debian:bullseye
#アプリケーション実行に必要なパッケージ等をインストール(今回は無し)
RUN apt update && apt upgrade -y
#コンテナイメージA(tmp_image)から/root/hello.exeをコピーする
COPY --from=tmp_image /root/hello.exe /root/hello.exe
また、Dockerfileと同じ階層に下記"hello.c"を作成する
[armadillo]# cat hello.c
#include <stdio.h>
void main()
{
printf("Hello World\n");
}
以上で準備は完了です。
2.DockerfileでコンテナイメージA,Bを作成
準備が出来たらビルドを実行します。
ここでは新規に作成するイメージ名を"image_df"、タグ名を"v1.0.0"とします。
[armadillo]# ls
Dockerfile hello.c
[armadillo]# podman build -t image_df:v1.0.0 .
[1/2] STEP 1/5: FROM docker.io/arm64v8/debian:bullseye AS tmp_image
[1/2] STEP 2/5: COPY hello.c /root/
--> 859c2c06ca0
[1/2] STEP 3/5: RUN apt update && apt upgrade -y
<中略>
[2/2] STEP 3/3: COPY --from=tmp_image /root/hello.exe /root/hello.exe
[2/2] COMMIT image_df:v1.0.0
--> 4ab37c55765
Successfully tagged localhost/image_df:v1.0.0
4ab37c55765b475ec4efc14fe9ab5b71f8967991d8d7f10de3f4d51a2aa85d7b
podman imagesコマンドでイメージのサイズを確認します。
[armadillo]# podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost/image_df v1.0.0 4ab37c55765b 12 seconds ago 146 MB ←コンテナイメージB(実運用のイメージ)
<none> <none> b35ed66cbd8c 29 seconds ago 444 MB ←コンテナイメージA(ビルド用のイメージ)
docker.io/arm64v8/debian bullseye a37d66742c80 4 days ago 123 MB ←元のコンテナイメージ
#不要な中間イメージは使用しない為、削除
[armadillo]# podman rmi b35ed66cbd8c
上記より、今回は不要なパッケージをインストールしない様にすることで
約300MBのサイズを抑える事が出来ました。
最後に動作確認として、hello.exeがきちんと実行できるか確認します。
#コンテナをバックグラウンドで作成~起動
[armadillo]# podman run -itd --name=test image_df:v1.0.0 /bin/bash
7eed8dae767cd39c682bc48e7385d0e695712321ac9aefb4672dfd7ccbc4e61d
#コンテナ内の/root/hello.exeを実行
[armadillo]# podman exec -it test ./root/hello.exe
Hello World
アプリが正常動作している為、以上でコンテナイメージの作成は完了です。