ブログ

Armadillo Base OS:Dockerfileを用いたコンテナイメージ作成方法

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

アプリが正常動作している為、以上でコンテナイメージの作成は完了です。