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