スクエニ ITエンジニア ブログ

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 されてしまっているように見えます。

Docker Desktop での image list

このため、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 ファンのみなさんにご覧いただけたら幸いです。

それではまた 👋

この記事を書いた人

記事一覧
SQUARE ENIXでは一緒に働く仲間を募集しています!
興味をお持ちいただけたら、ぜひ採用情報ページもご覧下さい!