なになれ

IT系のことを記録していきます

ARM用コンテナイメージを楽に用意する方法(OSS限定)

ラズベリーパイでKubernetesクラスタを構築した場合、ラズベリーパイはCPUがARMアーキテクチャなので、各種プログラムの起動には、ARM用コンテナイメージが必要になります。
Argo CDなどで有名なArgo Projectのツールでは、ARM用のコンテナイメージがないこともあり、自分でARM用のコンテナイメージを用意する必要があります。

これを解決する手段として、Drone CloudというCIサービスを利用すると、OSSの場合には、無料でARM Serverを利用したビルドを実行できることを知りました。

blog.drone.io

今回は、このDrone Cloudを利用して、Argo RolloutsのARM用コンテナイメージを作ってみました。

内容

Drone Cloudの設定

Drone Cloudを利用するセットアップを行います。
まずはリポジトリを用意します。

Argo Rolloutsのリポジトリはこちらです。 github.com

Argo RolloutsのリポジトリをForkします。

Drone Cloudにサインインします。

cloud.drone.io

サインインすると、自分のGitHubリポジトリが一覧されますので、Forkしたリポジトリを選択します。
Settingsというメニューで設定を行います。

f:id:hi1280:20210129210442p:plain:w800

Secretsという項目でDocker Hubの認証情報を設定します。
docker_usernameにはDocker HubのID、docker_passwordにはDocker Hubのパスワードを設定します。

f:id:hi1280:20210129210650p:plain:w800

ソースの修正

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リポジトリのタグ名になります。
usernamepasswordには、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.ymlDockerfileをGitリポジトリにPushすることでDrone Cloudが実行されます。
Drone Cloudの画面で実行結果が確認できます。
f:id:hi1280:20210129215819p:plain:w800

正常に実行が完了すれば、以下のようにDocker Hubにイメージが作成されるはずです。

hub.docker.com

まとめ

Drone Cloudを利用すると簡単にARM用コンテナイメージを作成できます。
困った時には暫定措置として利用できそうです。

参考