🐷

Apple M1でkubernetes/websiteを動かす

2021/02/18に公開
3

これはなに

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内部でビルド環境が完結していたので簡単に解決できました。

Discussion

おけぽよおけぽよ

こちらを参考にしてkubernetes/websiteを動かすことができました。ありがとうございます。
1点修正いただきたい箇所があります。

docker build -t localhost/hugoextended --target build --build-arg HUGO_BUILD_TAGS=extended .

こちらを実行したところ、以下のエラーとなりました。

"docker build" requires exactly 1 argument.
See 'docker build --help'.

Usage:  docker build [OPTIONS] PATH | URL | -

Build an image from a Dockerfile

原因は--target build--build-argの間が全角スペースになっていることです。半角スペースにしたらビルドできました。

RyuSARyuSA

ぬぉぉぉ!?なんてこった……指摘ありがとうございます!
修正します〜!