Apple M1でkubernetes/websiteを動かす

2 min読了の目安(約2000字TECH技術記事

2021年2月18日現在の状況のため、最新の情報ではないことご注意ください。

これはなに

Kubernetesの日本語ドキュメントの更新をしていたときのこと。

https://twitter.com/ryusa_eng/status/1362028734350417920?s=20

現在自分はApple M1のMacbookProを使っているのですが、kubernetes/werbsiteをローカルで起動するとエラーが発生してしまいHugoが起動しませんでした。

……とはいえ、すでにApple M1を一ヶ月触ってきたのでなんとなく原因はCPUアーキテクチャの問題だろうと目処はつきました。(もう慣れた)
そこでDockerfile含め少し修正してkubernetes/websiteを動かしました、というのが今回のお話です。もし参考になれば。

Dockerfileの問題の箇所

問題はシンプルで、ここが原因。

https://github.com/kubernetes/website/blob/release-1.19/Dockerfile#L25
# 一部抜粋
# snip
RUN mkdir -p /usr/local/src && \
    cd /usr/local/src && \
    # ↓このバイナリのARM64向けが公開されていない
    curl -L https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_Linux-64bit.tar.gz | tar -xz && \
    mv hugo /usr/local/bin/hugo && \
    addgroup -Sg 1000 hugo && \

GithubのHugoのリポジトリから直接Hugo Extendedのバイナリを持ってきています。しかしこちらのバイナリはARM64向けにビルドされたものではないので、コンテナをビルドするだけではApple M1上で起動しません。
Hugoのreleaseページを確認してみましたが、ARM64対応のHugo Extendedのバイナリは公開していないっぽいです。

解決方法

仕方ないのでHugoを自分でビルドし、ARM64向けのバイナリを作成してDockerfileに噛ませてあげました。

# Hugoを自分でビルドするぞ!!
# Hugoのリポジトリを持ってくる
git clone https://github.com/gohugoio/hugo.git
cd hugo
# Hugoのビルドを実行、タグ名は適当に
docker build -t localhost/hugoextended --target build --build-arg HUGO_BUILD_TAGS=extended .

そしてDockerfileを微修正。

# snip

# 作成したビルダーイメージからHugo Extendedのバイナリを引っこ抜いてくる
COPY --from=localhost/hugoextended /go/bin/hugo /usr/local/src/hugo

RUN mkdir -p /usr/local/src && \
    cd /usr/local/src && \
    # バイナリは外から持ってこないためこのコマンドは削除
    # curl -L https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_Linux-64bit.tar.gz | tar -xz && \
    mv hugo /usr/local/bin/hugo && \
    addgroup -Sg 1000 hugo && \
    adduser -Sg hugo -u 1000 -h /src hugo

# snip

この状態でmake container-imageコマンドを使って作成したコンテナイメージを利用してmake container-serveを実行したところ、無事kubernetes/websiteがローカルで動きました。

と言ったところで、無事ローカルでkubernetes/websiteが起動するようになりました。
GolangはCPUアーキテクチャ違っていても簡単にビルドができ、またDocker内部でビルド環境が完結していたので簡単に解決できました。