ARM用コンテナイメージを楽に用意する方法(OSS限定)
ラズベリーパイでKubernetesクラスタを構築した場合、ラズベリーパイはCPUがARMアーキテクチャなので、各種プログラムの起動には、ARM用コンテナイメージが必要になります。
Argo CDなどで有名なArgo Projectのツールでは、ARM用のコンテナイメージがないこともあり、自分でARM用のコンテナイメージを用意する必要があります。
これを解決する手段として、Drone CloudというCIサービスを利用すると、OSSの場合には、無料でARM Serverを利用したビルドを実行できることを知りました。
今回は、このDrone Cloudを利用して、Argo RolloutsのARM用コンテナイメージを作ってみました。
内容
Drone Cloudの設定
Drone Cloudを利用するセットアップを行います。
まずはリポジトリを用意します。
Argo Rolloutsのリポジトリはこちらです。 github.com
Argo RolloutsのリポジトリをForkします。
Drone Cloudにサインインします。
サインインすると、自分のGitHubリポジトリが一覧されますので、Forkしたリポジトリを選択します。
Settingsというメニューで設定を行います。
Secretsという項目でDocker Hubの認証情報を設定します。
docker_username
にはDocker HubのID、docker_password
にはDocker Hubのパスワードを設定します。
ソースの修正
ForkしたArgo Rolloutsのディレクトリで、最新バージョンのタグをチェックアウトします。
2021年1月29日現在で最新バージョンはv0.10.2です。
$ git clone https://github.com/hi1280/argo-rollouts.git $ cd argo-rollouts $ git checkout -b v0.10.2 v0.10.2
Drone Cloudが利用する設定ファイル(drone.yml
)をルート直下に作成します。
設定ファイルには、CIのパイプライン内容を記述します。
drone.yml抜粋
... kind: pipeline type: docker name: linux-arm platform: arch: arm os: linux steps: - name: publish image: plugins/docker settings: repo: hi1280/argo-rollouts tags: linux-arm-${DRONE_BRANCH} username: from_secret: docker_username password: from_secret: docker_password ...
kind: pipeline
は特に他の指定はなさそうです。
type: docker
はDocker環境で処理を実行する指定です。そのほかにホストマシンで直接実行することやKubernetes環境に対応して実行することもできるようです。
今回はあまり関係ないので、Docker環境で実行します。
platform
はARMなどのCPUアーキテクチャやOSの指定です。今回はARMでビルドしてARM用のイメージを作りたいのでARMを指定します。
steps
以降が処理内容です。
image: plugins/docker
がベースの処理です。
plugins/docker
を利用すると、Dockerイメージを作成して、DockerレジストリにPushするところまで実施できます。
http://plugins.drone.io/drone-plugins/drone-docker/
repo
には、Dockerリポジトリ名を指定します。
tags
には、Dockerイメージのタグ名を指定します。DRONE_BRANCH
はビルド対象のGitリポジトリのタグ名になります。
username
、password
には、Drone Cloudに設定したSecretsの内容を指定します。
drone.yml抜粋
... kind: pipeline type: docker name: manifest steps: - name: publish image: plugins/manifest settings: username: from_secret: docker_username password: from_secret: docker_password target: hi1280/argo-rollouts:${DRONE_BRANCH} template: hi1280/argo-rollouts:OS-ARCH-${DRONE_BRANCH} platforms: - linux/amd64 - linux/arm - linux/arm64 depends_on: - linux-arm64 - linux-arm - linux-amd64 ...
image: plugins/manifest
を利用すると、マルチアーキテクチャイメージを作成できます。
platforms
にはlinux/amd64
などの複数のアーキテクチャを指定します。
http://plugins.drone.io/drone-plugins/drone-manifest/
drone.ymlの全ソースは下記にあります。
argo-rollouts/.drone.yml at v0.10.2 · hi1280/argo-rollouts · GitHub
実際にDrone Cloudで実行してみると、Dockerfileでエラーになる箇所があったためコメントアウトしました。
Lintを実行している部分のようなのでイメージ作成には特に影響がないと思われます。
Dockerfile抜粋
# Install golangci-lint # RUN wget https://install.goreleaser.com/github.com/golangci/golangci-lint.sh && \ # chmod +x ./golangci-lint.sh && \ # ./golangci-lint.sh -b $GOPATH/bin && \ # golangci-lint linters # COPY .golangci.yml ${GOPATH}/src/dummy/.golangci.yml # RUN cd ${GOPATH}/src/dummy && \ # touch dummy.go \ # golangci-lint run
Dockerfileのソースは下記の通りです。
argo-rollouts/Dockerfile at v0.10.2 · hi1280/argo-rollouts · GitHub
実行
ここまでの準備ができたら、修正したdrone.yml
やDockerfile
をGitリポジトリにPushすることでDrone Cloudが実行されます。
Drone Cloudの画面で実行結果が確認できます。
正常に実行が完了すれば、以下のようにDocker Hubにイメージが作成されるはずです。
まとめ
Drone Cloudを利用すると簡単にARM用コンテナイメージを作成できます。
困った時には暫定措置として利用できそうです。