DockerでARM版イメージを使うときにハマらないための備忘録

最近、PCをSnapdragon搭載のWindows機に買い替えて個人開発をしていたんですが、普通に使っているつもりでも「あれ?なんか挙動がおかしいな」とか「起動しないな」と感じることがあり、今後もARMアーキテクチャのマシンで開発を行う機会も増えてくると思うので、書き残しておきます。

明示的に指定しないとうまく動かないことがある

結論から言うと、Dockerイメージを使用するときに、明確にArm版を使用するようにしないとうまく動作しないことがあるんです。

通常、Docker Desktopなどがよしなに解決してくれることもあるのですが、謎のエラーで落ちたり、コンテナが起動しなかったりすることがあります。

Node.jsやPythonといったよく使うランタイムでもこの現象は起こり得ます。なんとなく FROM python:3.9 と書いて安心していると、裏側で意図しないアーキテクチャのものが降ってきている可能性があるわけです。

確認先について

じゃあどれを使えばいいのかという話ですが、ARM版のイメージはこちらから確認できます。

参考:https://hub.docker.com/u/arm64v8

ここにあるような arm64v8 タグがついているものや、公式イメージの中でもアーキテクチャが明記されているものを意識して選ぶのが無難ですね。

構成ファイルの書き方

例えば Dockerfiledocker-compose.yml を書くときも、イメージを意識しておくと安心です。

# Dockerfileの例
FROM arm64v8/python:3.11

WORKDIR /app
COPY . .
CMD ["python", "app.py"]
# docker-compose.ymlの例
services:
  app:
    image: arm64v8/node:22
    # ...

このようにARM専用のタグがついたイメージを指定することで、問題なく動作させることができます。

以前はあまり気にせず latest を使っていればよかった場面でも、CPUアーキテクチャの違いによって、少し気を使う必要が出てきたという話でした。