Alpine LinuxでVS Code Serverを実行できないことがある
あるいは、VS Code Remote SSHで接続しているAlpine Linux上のDev Containerに、Dev Containers拡張機能で接続できないことがある
噛み砕いた前提条件の説明
VS Codeがインストールされている自分のマシンAがある。
Alpine LinuxがインストールされているマシンBがある。
マシンBにDev Container(Dev Containers)が作成されている。
このとき、
マシンAからマシンBに、VS CodeのRemote SSH拡張機能で接続できないことがある。
マシンAからマシンBのDev Containerに、Dev Containers拡張機能で接続できないことがある。
理由
VS Code Serverに同梱されているNode.jsがAlpine Linuxに対応していないから。
Alpine Linuxは標準Cライブラリとしてglibcではなくmuslを使っているので、glibcを前提としたソフトウェアを動作させることはできない。
マシンAからマシンBやマシンBのDev ContainerにVS Codeで接続したい場合は、マシンBにVS Code Serverがインストールされている必要がある。
VS Code Serverに同梱されているNode.jsがglibc前提の場合は、マシンBではそれが動作せず、マシンB上ではVS Codeの拡張機能を実行できない(ほとんどのことができない)。
対処法: VS Code Serverを実行するマシンでは、glibcを使っているLinuxディストリビューションを使う。
mgn901.iconの2025/5/28現在の環境の場合、
マシンBにRemote SSH拡張機能で接続できた。
マシンBにRemote SSH拡張機能で接続できた後は、マシンB上のDev ContainerにDev Containers拡張機能で接続することもできた。(成功例)
code:txt
# ここまで省略
899 ms Start: Run: docker inspect --type container happy_albattani
1107 ms Start: Check Docker is running
1107 ms Start: Run: docker version
# 省略(Docker Version Checkの結果が入る)
1254 ms Running Dev Containers CLI: set-up # 省略(引数が入る)
1254 ms Start: Checking for Dev Containers CLI
1342 ms Start: Run: /root/.vscode-server/cli/servers/Stable-848b80aeb52026648a8ff9f7c45a9b0a80641e2e/server/node /root/.vscode-remote-containers/dist/dev-containers-cli-0.413.0/dist/spec-node/devContainersSpecCLI.js set-up # 省略(引数が入る)
1578 ms @devcontainers/cli 0.76.0. Node.js v20.19.0. linux 6.8.0-60-generic x64.
# 以下省略
マシンBにRemote SSH拡張機能で接続する前に、マシンB上のDev ContainerにDev Containers拡張機能で接続することはできない。(失敗例)
code:txt
# ここまで省略
4627 ms Start: Run: uname -m
4705 ms Start: Run: /bin/sh (cat /etc/os-release || cat /usr/lib/os-release) 2>/dev/null
5519 ms Start: Extracting tarball
5520 ms Start: Run: mkdir -p /root/.vscode-remote-containers/bin/848b80aeb52026648a8ff9f7c45a9b0a80641e2e_1748392356409
5605 ms Start: Run: tar --no-same-owner -x --strip-components 1 -C /root/.vscode-remote-containers/bin/848b80aeb52026648a8ff9f7c45a9b0a80641e2e_1748392356409
34073 ms Start: Run: mv -n /root/.vscode-remote-containers/bin/848b80aeb52026648a8ff9f7c45a9b0a80641e2e_1748392356409 /root/.vscode-remote-containers/bin/848b80aeb52026648a8ff9f7c45a9b0a80641e2e
34183 ms Start: Run: docker inspect --type container happy_albattani
34459 ms Start: Check Docker is running
34460 ms Start: Run: docker version
# 省略(Docker Version Checkの結果が入る)
34682 ms Running Dev Containers CLI: set-up # 省略(引数が入る)
34683 ms Start: Checking for Dev Containers CLI
34702 ms Start: Copying Dev Containers CLI
34764 ms Start: Run: tar --no-same-owner -x -f -
35527 ms Start: Run: /root/.vscode-remote-containers/bin/848b80aeb52026648a8ff9f7c45a9b0a80641e2e/node /root/.vscode-remote-containers/dist/dev-containers-cli-0.413.0/dist/spec-node/devContainersSpecCLI.js set-up # 省略(引数が入る)
35619 ms Error: CodeError(ProcessSpawnFailed(Os { code: 2, kind: NotFound, message: "No such file or directory" }))
at Object.resolve (/Users/user0/.vscode/extensions/ms-vscode-remote.remote-ssh-0.120.0/out/extension.js:2:295719)
at /Users/user0/.vscode/extensions/ms-vscode-remote.remote-ssh-0.120.0/out/extension.js:2:294418
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
35619 ms Exit code ENOENT
ログからわかる、成功例と失敗例の違い
失敗した方は、何かのtarballを取得して/root/.vscode-remote-containers/bin/848b80aeb52026648a8ff9f7c45a9b0a80641e2eに移動する動作を行っている。
失敗した方は、Copying Dev Containers CLIしている。
使っているNode.jsのファイルが違う。
成功した方: /root/.vscode-server/cli/servers/Stable-848b80aeb52026648a8ff9f7c45a9b0a80641e2e/server/node
失敗した方: /root/.vscode-remote-containers/bin/848b80aeb52026648a8ff9f7c45a9b0a80641e2e/node
/root/.vscode-remote-containers/bin/848b80aeb52026648a8ff9f7c45a9b0a80641e2e/nodeを実行してみた。
code:txt
$ /root/.vscode-remote-containers/bin/848b80aeb52026648a8ff9f7c45a9b0a80641e2e/node
/bin/sh: /root/.vscode-remote-containers/bin/848b80aeb52026648a8ff9f7c45a9b0a80641e2e/node: No such file or directory # おかしいなぁ、存在するはずなのに
$ bash # bashで実行したら何を言われるのだろう
$ /root/.vscode-remote-containers/bin/848b80aeb52026648a8ff9f7c45a9b0a80641e2e/node
bash: /root/.vscode-remote-containers/bin/848b80aeb52026648a8ff9f7c45a9b0a80641e2e/node: cannot execute: required file not found # なにコレ???
cannot execute: required file not foundは、glibc前提のソフトウェアをAlpine Linuxで動かした時に起きるエラーと見なされている。
「実行に必要なファイルが見つからない」というメッセージで、今回のようなケースだと、標準ライブラリが欠落していると考えるのが妥当かと。mgn901.icon
Error when running mirrord: /usr/local/bin/mirrord: cannot execute: required file not found · Issue #2334 · metalbear-co/mirrord · GitHub
CoderでリモートDev ContainerをつくるをDocker in Dockerで実装しようとしたときに遭遇した。
Docker in Dockerのための公式コンテナイメージのベースイメージはAlpine Linuxだった。
cruizba/ubuntu-dindという、Docker in DockerのためのコンテナイメージでベースイメージがUbuntuのものがあったので、それを使うことにした。