おは代々木ダイアリー

いろいろ試したメモを書きます。このブログはアフィリエイトを使用したプロモーションを含みます

azure-functions-core-toolsをLinux arm64でも使いたいのでビルドする

devcontainerを使ってAzure Functionsを使用したWebアプリの開発をしたいと思いましたが、Microsoftが提供しているコンテナイメージは x86_64 のみの提供となっており、ARM64なLinuxマシンで開発したい!というケースで使えないという問題が発生しました。

https://hub.docker.com/_/microsoft-azure-functions

ARM用のバイナリをビルドしよう

幸い、azure-functions-core-toolsはオープンソースであり、ソースコードが公開されています。

github.com

build.sh を参考にビルドしてみます。

dotnet build Azure.Functions.Cli.sln
dotnet publish src/Azure.Functions.Cli/Azure.Functions.Cli.csproj --runtime linux-arm64 --output /tmp/cli

/tmp/cli/func というファイルが生成されて、実行できることが確認できればOKです。

Dockerfileでビルドしてみる

と、ここまでで一旦ビルドして使えるものができてしまったわけなのでこれで完成、でもよいのですがこれでは芸がないのでDockerfile内でビルドして本命のDockerコンテナ内で使えるようにしていきたいと思います。

手順としては、

  • dotnet sdkが使用可能なコンテナ内でビルドする
  • ビルドしたバイナリを本命コンテナイメージ内にコピーする

といった感じです。本命コンテナイメージ内ではdotnet sdkを使用できる必要はないので、マルチステージビルドを行います。

Dockerfile

いきなりですが、Dockerfileです。

FROM mcr.microsoft.com/dotnet/sdk:7.0 AS builder
RUN git clone https://github.com/Azure/azure-functions-core-tools
RUN cd azure-functions-core-tools \
    && dotnet build Azure.Functions.Cli.sln \
    && dotnet publish src/Azure.Functions.Cli/Azure.Functions.Cli.csproj --runtime linux-arm64 --output /usr/local/src/azure-functions-core-tools/cli

# You can use any other container image 
FROM node:16-bullseye
COPY --from=builder /usr/local/src/azure-functions-core-tools /usr/local/src/azure-functions-core-tools
RUN ln -s /usr/local/src/azure-functions-core-tools/cli/func /usr/local/bin/func

今回のスクリプトDockerfile for building azure-functions-core-tools for linux-arm64 ( for nodejs ) · GitHub で公開しています。

やっている内容としては、mcr.microsoft.com/dotnet/sdk:7.0 のコンテナイメージをbuilderとして名付け、Azure Functions Core Toolsをビルドさせ、本命のnode:16-bullseye 内にコピーさせ/usr/local/binにシンボリックリンクを貼るという感じです。

node:16-bullseye としているところは別のコンテナイメージでも大丈夫なはずです。今回はJavascriptを使用したAzure Functionsだったのでnodeのイメージを使用しましたがpythonの方はpythonで良いですし、他のコンテナ使う人は他でも大丈夫です。

終わりに

以上、Azure Functions Core ToolsをARM64なLinuxでビルドして使ってみるという内容でした。今回のDockerfileを使うことでDev Containersを使ったAzure Functionsの開発がARM64(aarch64)なLinuxでもやりやすくなりますね。

今回のビルドは「とりあえず動くようにしてみた」レベルの内容で、特にテストが通ったとかそういうわけでもないので何か問題が起こるかもしれません(当方はfunc startでHTTP Handlerが動作することを確認した程度です)。

理想としてはazure functions core toolsのコンテナイメージがマルチアーキテクチャlinux-amd64対応になってくれると良いのですが、コンテナイメージのコードを読むとマルチアーキテクチャの差分はaptで吸収しているのでapt側で先に取り込まれる必要がありそうです。

とはいえ、Issueは立っているしApple M1の対応はなされているのでLinux ARM64版がリリースされるのも時間の問題かなと思いますが…

Release for aarch64 · Issue #3112 · Azure/azure-functions-core-tools · GitHub

良いお年を

晦日にこれを書いていますが、なんとか2022年中に動かして書くことができました。来年もものづくりをする一年にしたいと思います。 みなさんも良いお年をお迎え下さい!