コンテナ共創センター勉強会#16 での「マルチアーキテクチャ対応のコンテナイメージの作成」セッション資料となります。
IBM Technologyマルチアーキテクチャー対応のコンテナイメージの作成2022年08⽉31⽇⽇本アイ・ビー・エム システムズ・エンジニアリング株式会社テクノロジー・コンピテンシー・センター滝澤 直也コンテナ共創センター勉強会 #16
View Slide
© 2022 IBM Corporation 2コンテナのアーキテクチャー依存性§ コンテナはポータビリティのあるアプリケーション開発⼿法ですがコンテナイメージはCPUアーキテクチャーごとに作成する必要がありますオンプレ クラウドコンテナイメージデプロイデプロイコンテナのメリット:様々な環境にデプロイできるポータビリティマルチアーキテクチャー環境:アーキテクチャーごとにコンテナイメージが必要x86IBM PowerARMx86⽤コンテナイメージIBM Power⽤コンテナイメージARM⽤コンテナイメージアーキテクチャーごとにコンテナイメージを作成するのは⼤変?アーキテクチャーごとにコンテナ開発環境が必要?
© 2022 IBM Corporation 3マルチアーキテクチャー対応のコンテナイメージ作成§ マルチアーキテクチャー対応のコンテナイメージ作成は簡単です⼀般的な開発環境であるx86環境で作成可能必要なパッケージはqemu-user-staticのみDockerfileは(ほぼ)アーキテクチャー依存なし本⽇はFedoraとRHELでのマルチアーキテクチャー対応コンテナイメージの作成⽅法をご紹介します※Fedora Red Hat Enterprise LinuxDockerfileは全アーキテクチャーで共通 Dockerfileは少しだけアーキテクチャー依存部分を持つ※Fedora, RHELでなくてもマルチアーキテクチャー対応コンテナイメージは作成できます
© 2022 IBM Corporation 4マルチアーキテクチャー対応コンテナイメージ作成の概要§ qemu-user-staticがサポートされるかによって⼿順が違います– Fedora:サポートあり– RHEL:サポートなしFedora Red Hat Enterprise Linux• qemu-user-staticをサポート• Dockerfileは全アーキテクチャーで共通• ビルド時にアーキテクチャを指定• qemu-user-staticがサポートされない• Dockerfileは⼀部に各アーキテクチャー固有の記載が必要共通Dockerfile コンテナイメージ アーキテクチャー固有Dockerfileコンテナイメージ共通Dockerfileアーキテクチャー指定ビルド ビルド変換アーキテクチャー指定なし
© 2022 IBM Corporation 5マルチアーキテクチャー対応コンテナイメージ作成(Fedora)§ qemu-user-staticがサポートされるかによって⼿順が違います– Fedora:サポートあり– RHEL:サポートなしFedora Red Hat Enterprise Linux• qemu-user-staticをサポート• Dockerfileは全アーキテクチャーで共通• ビルド時にアーキテクチャを指定• qemu-user-staticがサポートされない• Dockerfileは⼀部に各アーキテクチャー固有の記載が必要共通Dockerfile コンテナイメージ アーキテクチャー固有Dockerfileコンテナイメージ共通Dockerfileアーキテクチャー指定ビルド ビルド変換アーキテクチャー指定なし
© 2022 IBM Corporation 6マルチアーキテクチャー対応コンテナイメージ作成(Fedora)§ Fedoraでマルチアーキテクチャー対応コンテナイメージを作成(1/2)– 前提パッケージの導⼊§ Fedoraではqemu-user-staticを導⼊可能– Dockerfileを作成§ アーキテクチャー固有の記載はないDockerfileを準備– コンテナイメージを作成§ platformオプションにてアーキテクチャーを指定– 作成したコンテナイメージのアーキテクチャーを確認§ アーキテクチャーがppc64leと表⽰される# dnf install -y podman buildah qemu-user-static# cat DockerfileFROM ubuntu:20.04RUN apt-get update && apt-get install -y curl# buildah bud --platform=linux/ppc64le -f Dockerfile -t focal-test:p1# podman run --rm focal-test:p1 uname -mppc64leFedora on x86
© 2022 IBM Corporation 7マルチアーキテクチャー対応コンテナイメージ作成(Fedora)§ Fedoraでマルチアーキテクチャー対応コンテナイメージを作成(2/2)– 作成したコンテナイメージをDockerhubにpush§ XXXXXはアカウント名– Linux on Powerでコンテナを稼働§ Linux on Power環境にはpodmanが導⼊されていることが前提§ Linux on Power環境でDockerhubからコンテナイメージをpullして実⾏# podman push focal-test:p1 XXXXX/focal-test:p1# podman run --rm docker.io/XXXXX/focal-test:p1 uname -mppc64leFedora on x86RHEL on Power
© 2022 IBM Corporation 8マルチアーキテクチャー対応コンテナイメージ作成(RHEL)§ qemu-user-staticがサポートされるかによって⼿順が違います– Fedora:サポートあり– RHEL:サポートなしFedora Red Hat Enterprise Linux• qemu-user-staticをサポート• Dockerfileは全アーキテクチャーで共通• ビルド時にアーキテクチャを指定• qemu-user-staticがサポートされない• Dockerfileは⼀部に各アーキテクチャー固有の記載が必要共通Dockerfile コンテナイメージ アーキテクチャー固有Dockerfileコンテナイメージ共通Dockerfileアーキテクチャー指定ビルド ビルド変換アーキテクチャー指定なし
© 2022 IBM Corporation 9マルチアーキテクチャー対応コンテナイメージ作成(RHEL)§ RHELでマルチアーキテクチャー対応コンテナイメージを作成(1/2)– 前提パッケージの導⼊§ Podmanとbuildahのみが前提条件– Dockerfileを作成§ アーキテクチャー固有の記載はないDockerfileをベースにqemu-user-static対応に修正– コンテナイメージを作成§ platformオプションは使⽤せずにビルドを実⾏– ここでは作成したコンテナイメージのアーキテクチャーを確認できません§ qemu-user-staticがホストOSに導⼊されていないのでエラーになります# dnf install –y podman buildahFROM multiarch/qemu-user-static:x86_64-ppc64le as qemuFROM ppc64le/ubuntu:20.04COPY --from=qemu /usr/bin/qemu-ppc64le-static /usr/binRUN apt-get update && apt-get install -y curlRUN rm /usr/bin/qemu-ppc64le-static# buildah bud -f containerfile_ppc64le -t test-multiarch:p1RHEL on x86アーキテクチャ固有の記述アーキテクチャ固有の記述アーキテクチャ固有の記述アーキテクチャ固有の記述
© 2022 IBM Corporation 10マルチアーキテクチャー対応コンテナイメージ作成(RHEL)§ RHEL8.4でマルチアーキテクチャー対応コンテナイメージを作成(2/2)– 作成したコンテナイメージをDockerhubにpush§ XXXXXはアカウント名– Linux on Powerでコンテナを稼働§ Linux on Power環境にはpodmanが導⼊されていることが前提§ Linux on Power環境でDockerhubからコンテナイメージをpullして実⾏# podman push test-multiarch:p1.1 XXXXX/test-multiarch:p1# podman run -it --rm docker.io/XXXXX/test-multiarch:p1ppc64leRHEL on x86RHEL on Power
© 2022 IBM Corporation 11RHEL環境でのDockerfileの⾃動変換§ RHEL環境でアーキテクチャ⾮依存のDockerfileをビルド可能な形式に変換– スクリプトを準備することでアーキテクチャ⾮依存のDockerfileをRHEL環境でビルド可能な形式に変換できます§ サンプルスクリプト# cat convert_containerfile.sh#!/bin/bashFILENAME=$1ARCH=$2CONV_FILE="${FILENAME}_${ARCH}"TMP_FILE="${FILENAME}_tmp"grep CMD ${FILENAME} > /dev/nullFLG_CMD=$?grep ENTRYPOINT ${FILENAME} > /dev/nullFLG_ENT=$?cat ${FILENAME} | sed -e "s/FROM /FROM ${ARCH}¥//g" | ¥sed -e "/FROM/a COPY --from=qemu /usr/bin/qemu-${ARCH}-static /usr/bin" | ¥sed -e "1i FROM multiarch/qemu-user-static:x86_64-${ARCH} as qemu" > ${TMP_FILE}if [[ ${FLG_CMD} -eq 0 ]]; thencat ${TMP_FILE} | sed -e "/CMD/i RUN rm /usr/bin/qemu-${ARCH}-static" > ${CONV_FILE}elif [[ ${FLG_ENT} -eq 0 ]]; thencat ${TMP_FILE} | sed -e "/ENTRYPOINT/i RUN rm /usr/bin/qemu-${ARCH}-static" > ${CONV_FILE}elsecat ${TMP_FILE} | sed -e "¥$a RUN rm /usr/bin/qemu-${ARCH}-static" > ${CONV_FILE}firm ${TMP_FILE}
© 2022 IBM Corporation 12RHEL環境でのDockerfileの⾃動変換§ RHEL環境でアーキテクチャー⾮依存のDockerfileをビルド可能な形式に変換– スクリプトの実⾏例§ オリジナルのDockerfileを確認§ ⾃動変換スクリプトを実⾏§ 変換後のDockerfileを確認# cat containerfile_ppc64leFROM multiarch/qemu-user-static:x86_64-ppc64le as qemuFROM ppc64le/ubuntu:20.04COPY --from=qemu /usr/bin/qemu-ppc64le-static /usr/binRUN apt-get update && apt-get install -y curlRUN rm /usr/bin/qemu-ppc64le-staticCMD ["/bin/bash"]# cat containerfileFROM ubuntu:20.04RUN apt-get update && apt-get install -y curlCMD ["/bin/bash"]# ./convert_containerfile.sh containerfile ppc64le
© 2022 IBM Corporation 13CI/CDパイプラインでのマルチアーキテクチャー対応§ マルチアーキテクチャー対応コンテナイメージ作成の⾃動化– CI/CDパイプラインに組み込むことで⾃動化可能です§ 各アーキテクチャーごとに前項で紹介した処理を実⾏するパイプラインを作成アプリ開発者ソースコード・リポジトリ(Git)アプリ・コード開発環境DockerレジストリコンテナイメージCIパイプラインClone SASTBuild Scan Pushx86イメージをビルド各アーキテクチャーのコンテナイメージが登録されるマニフェスト・リポジトリ(Git)アプリ・マニフェストIBM Power環境CDパイプラインFetch ApplyBuild Scan Pushx86環境CDパイプラインFetch Applyアプリ利⽤者①コードをコミット②リポジトリ更新を検知③コンテナイメージを登録④コンテナイメージ更新を検知IBM Powerイメージをビルドマルチアーキテクチャー対応コンテナイメージ作成の⾃動化例