はじめに
UdemyのScala 3講座を始めるにあたり、ローカルPCの環境を汚したくなかったため、Docker(Dev Containers)を使って開発環境を構築しました。
その際、Apple Silicon Mac特有のエラーに遭遇し、解決するまでに学んだことを記録として残します。
開発環境
- マシン: MacBook Air (Apple Silicon arm64)
- Dockerエンジン: OrbStack(軽量で爆速なので採用)
- エディタ: VS Code (Dev Containers拡張)
遭遇した課題
当初、教材を参考に以下のイメージを使おうとしましたが、エラーが発生しました。
エラーログ:
Error response from daemon: No such image: sbtscala/scala-sbt:eclipse-temurin-jammy-17.0.10_1.9.9_3.3.3
原因
エラーログ自体は単なる「イメージが見つからない」という内容ですが、調べてみたところ「自分のPC(Apple Silicon = arm64)に対応したアーキテクチャのイメージが存在しなかったこと」が本当の原因でした。
指定した sbtscala のイメージは Intelチップ(amd64)向け に提供されており、Dockerが「M1 Mac (arm64) 用の同じファイルを探したけれど、見つからない(= No such image)」と判断してエラーを返していた、というのが真相でした
解決策
そこで、一部の環境でしか動かないイメージを直接指定するのをやめました。
代わりに、Apple Silicon(arm64)を含めたマルチアーキテクチャに公式対応している MicrosoftのJava 17用コンテナイメージ を土台として採用しました。その上で、コンテナが立ち上がるタイミングで sbt を自動インストールする構成に変更しました
最終的な設定ファイル
docker-compose.yml
services:
scala-env:
image: [mcr.microsoft.com/devcontainers/java:17](https://mcr.microsoft.com/devcontainers/java:17)
volumes:
- .:/workspace
working_dir: /workspace
command: /bin/bash
tty: true
devcontainer.json
{
"name": "Scala 3 Development",
"dockerComposeFile": "../docker-compose.yml",
"service": "scala-env",
"workspaceFolder": "/workspace",
"remoteUser": "vscode",
"customizations": {
"vscode": {
"extensions": [
"scalameta.metals",
"scala-lang.scala"
]
}
},
"postCreateCommand": "bash -c 'source /usr/local/sdkman/bin/sdkman-init.sh && sdk install sbt'"
}
学んだこと
-
アーキテクチャの意識: Dockerイメージには amd64 と arm64 の違いがあり、自分のマシンに合ったものを選ぶ重要性を学びました。
-
Dev Containersの便利さ: postCreateCommand を使うことで、チーム全員が全く同じツール(今回はsbt)が入った状態で開発を開始できるのは非常に強力だと感じました。
-
エラーログの読み方: No such image や arm64 といったキーワードから、何が原因かを推測する訓練になりました。
終わりに
環境構築で半日ほど足止めを食らいましたが、結果としてDockerやインフラ周りの理解が深まりました。これからいよいよScalaのコーディングに入っていきます!
同じ構成で詰まっている方の参考になれば幸いです。