Apple シリコン Mac 上の VS Code Dev Container を x86_64 で使う
Dev Container ファンのホシイです。
わりと最近まで Intel CPU 搭載の MacBook を使ってきたのですが、経年には勝てず、更新のためにふだんの作業環境を Apple シリコン搭載の MacBook に切り替えました。
しかし、開発ターゲット (サーバー環境) は引き続き Intel が大多数ですし、チームでは Windows での開発も混在しているので、開発やテストは Intel (というか amd64 または x86_64) で行うのが望ましい状況です。特に、開発対象に native library への依存があったりするとなおさらですよね。
Container というか Docker の状況
Docker では、Apple シリコン Mac でも以下のようにして --platform
を指定すれば x86_64 で動作させることができます。
❯ docker run -it --rm --platform=linux/amd64 ubuntu
root@a88443f3296c:/# arch
x86_64
このとき、使用される container image ももちろん amd64 のものが pull されており、Docker CLI ではわかりにくいのですが、Docker Desktop であれば image の一覧で AMD64
マークが付いて表示され、判別しやすくなっています。(下の方で参考になる画像を貼っておきます)
VS Code Dev Container
実行環境はよしとして、Visual Studio Code の Dev Container 機能にはもう少し複雑な状況があります。
もっとも単純な devcontainer 設定では image のみ指定して起動することがありますが、このときは以下のように runArgs に --platform
を指定するだけで、合致する arch の image が pull されて動作するようです。
{
"name": "devcontainer",
"image": "mcr.microsoft.com/devcontainers/base:ubuntu",
"runArgs": ["--platform=linux/amd64"],
...
}
が、ここで Dev Container でとても便利な機能、feature 設定を追加したときに問題が起きます。
{
"name": "devcontainer",
"image": "mcr.microsoft.com/devcontainers/base:ubuntu",
"runArgs": ["--platform=linux/amd64"],
"features": {
"ghcr.io/devcontainers/features/git:1": {}
},
...
}
log から抜粋します。
[2024-04-09T05:04:30.313Z] Stop (3031 ms): Run: docker buildx build --load --build-context dev_containers_feature_content_source=/var/folders/ww/3l46g4vs4g5dt7ndmtfzxvz80000gq/T/devcontainercli/container-features/0.55.0-1712639065862 --build-arg _DEV_CONTAINERS_BASE_IMAGE=mcr.microsoft.com/devcontainers/base:ubuntu --build-arg _DEV_CONTAINERS_IMAGE_USER=root --build-arg _DEV_CONTAINERS_FEATURE_CONTENT_SOURCE=dev_container_feature_content_temp --target dev_containers_target_stage -t vsc-devcontainer-demo-bb231256b703f945d8e0271b22b027bb361d16c2a64fa6509cf1d2ab3e427f84-features -f /var/folders/ww/3l46g4vs4g5dt7ndmtfzxvz80000gq/T/devcontainercli/container-features/0.55.0-1712639065862/Dockerfile.extended /Users/hoshy/Library/Application Support/Code/User/globalStorage/ms-vscode-remote.remote-containers/data/empty-folder
[2024-04-09T05:04:30.314Z] Start: Run: docker events --format {{json .}} --filter event=start
[2024-04-09T05:04:30.316Z] Start: Starting container
[2024-04-09T05:04:30.316Z] Start: Run: docker run --sig-proxy=false -a STDOUT -a STDERR --mount type=bind,source=/Users/hoshy/projects/devcontainer-demo,target=/workspaces/devcontainer-demo,consistency=cached --mount type=volume,src=vscode,dst=/vscode -l devcontainer.local_folder=/Users/hoshy/projects/devcontainer-demo -l devcontainer.config_file=/Users/hoshy/projects/devcontainer-demo/.devcontainer/devcontainer.json --platform=linux/amd64 --entrypoint /bin/sh vsc-devcontainer-demo-bb231256b703f945d8e0271b22b027bb361d16c2a64fa6509cf1d2ab3e427f84-features -c echo Container started
[2024-04-09T05:04:30.914Z] Unable to find image 'vsc-devcontainer-demo-bb231256b703f945d8e0271b22b027bb361d16c2a64fa6509cf1d2ab3e427f84-features:latest' locally
[2024-04-09T05:04:32.409Z] docker: Error response from daemon: pull access denied for vsc-devcontainer-demo-bb231256b703f945d8e0271b22b027bb361d16c2a64fa6509cf1d2ab3e427f84-features, repository does not exist or may require 'docker login'.
どうも feature を指定すると、ベースの image を元に container build をしてその image で Dev Container を起動するようなのですが、この時の image build が (上記の --platform=amd64
指定を参照せず) arm64
でおこなわれてしまうようです。
Docker Desktop の UI では以下のように見えます。vsc-
ではじまるのが Dev Container で自動的に build された image ですが、ひとつ前のものには AMD64
マークがついています。一番上の (最新の) ものにはそのマークが無いので、linux/amd64
で build したかったものが、意図に反して linux/arm64
で build されてしまっているように見えます。
このため、container build まではうまくいきつついざそれを起動しようという段階で (起動しようとする amd64
の image が無いので) “Unable to find image vsc- …” という error で失敗してしまうようです。
回避方法
この問題ですが、実用上はわりとかんたんな回避方法があります。
devcontainer.json で image を指定するのではなく build を指示し、そのときに使う Dockerfile で --platform
を指定するという方法です。
{
"name": "devcontainer",
"build": {
"dockerfile": "Dockerfile"
},
"runArgs": ["--platform=linux/amd64"],
"features": {
"ghcr.io/devcontainers/features/git:1": {}
},
...
}
FROM --platform=linux/amd64 mcr.microsoft.com/devcontainers/base:ubuntu
これで feature を使用する container image build で --platform
を指定することができ、実行時に image を意図通り発見できるようになります。
うーんバグ? と思い調べたところ、GitHub に Issue がありました。
Can’t specify platform for Docker image in DevContainers
Dev Container の image platform を指定することができないという内容です。feature には触れられていませんがこちらのほうが根本的な指摘になっているので、これが対応されれば修正されるでしょう。去年 (2023) から進んでいないようですが…
まとめ : とりあえず解決しているが…
Apple シリコン Mac が唯一のラインナップになって (Intel Mac が選択できなくなって) もう数年経ち、さすがに大きな問題は無くなっただろうと思っていたのですが、意外とまだひっかかるところはあるようです。
まだ確認はできていないですが性能上の影響も気になるので、可能であれば arm64 で作業したほうが変にハマるようなこともなさそうですね。Python や TypeScript なんかは問題が少ないのでしょうか。
他にも --platform
関係ではいろいろと Issue があがっているようです。以下も気になったのでここに置いておきます。
このブログでは他にも Dev Container に関する記事 をいくつか書いているので、Dev Container ファンのみなさんにご覧いただけたら幸いです。
それではまた 👋