VsCode v1.77以降のDevContainers拡張でalpine v3.12コンテナに接続できない

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417736/ad76724b-2c55-d1aa-de03-ac1b813dc99e.png" alt="vscode" width="80">

`vscode - v1.77`以降の`alpine - v3.12`のコンテナイメージ(`php:7.2-fpm-alpine`)で、DevContainers拡張でコンテナに接続できなくなった。
ログを見ると何やら`symbol not found`エラーが出ていて、コンテナ内のVsCodeServerの起動に失敗しているためVsCodeから通信ができないようだ。

なお、コンテナ単体は起動する。

```text
[5733 ms] Container server: Error relocating /root/.vscode-server/bin/b3e4e68a0bc097f0ae7907b217c1119af9e03435/node: _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7reserveEv: symbol not found
Error relocating /root/.vscode-server/bin/b3e4e68a0bc097f0ae7907b217c1119af9e03435/node: _ZSt28__throw_bad_array_new_lengthv: symbol not found
[5752 ms] Error: stream ended with:0 but wanted:9
        at c (/Users/fullhouse/.vscode/extensions/ms-vscode-remote.remote-containers-0.292.0/dist/extension/extension.js:24:101670)
        at /Users/fullhouse/.vscode/extensions/ms-vscode-remote.remote-containers-0.292.0/dist/extension/extension.js:24:101851
        at s (/Users/fullhouse/.vscode/extensions/ms-vscode-remote.remote-containers-0.292.0/dist/extension/extension.js:27:5371)
        at Socket.<anonymous> (/Users/fullhouse/.vscode/extensions/ms-vscode-remote.remote-containers-0.292.0/dist/extension/extension.js:27:5541)
        at Socket.emit (node:events:525:35)
        at endReadableNT (node:internal/streams/readable:1358:12)
        at process.processTicksAndRejections (node:internal/process/task_queues:83:21)
```

## 原因

> spdlogと他のネイティブモジュールは、microsoft/vscode-linux-build-agent@007bc8f以降のnode:16.9.1-alpineでビルドされており、libstdc++ v6.0.30が付属しているのに対し、ruby:2.7-alpine3.13にはlibstdc++ v6.0.28しか含まれていません。また、node.jsバイナリのアップストリームalpineイメージは、libstdc++ v6.0.30 https://github.com/nodejs/docker-node/tree/bd6c00f07c5a3b311ce0e346ab69df6b9ef8d08f/16/alpine3.17 でビルドされています。したがって、nodejs/node#41058で述べられているように、ユーザがコンテナ内のlibstdc++バージョンをアップグレードするしか解決策はないと思います。
[1.77 you can no longer have any extensions on a remote container as of 10295b5 · Issue #178748 · microsoft/vscode · GitHub](https://github.com/microsoft/vscode/issues/178748)

VsCodeリポジトリのフォーラムによると`vscode-v1.77`以降で`vscode-server(nodejs)`の依存ライブラリ`spdlogと他のネイティブモジュール`のビルド環境のアップデートによって、これらが依存する`libstdc++`ライブラリが`v6.0.30`に引き上げられたようだが、古いalpineイメージにおいては`v6.0.28`がインストールされるため互換が失われた。的なことのようだ。

`php:7.2-fpm-alpine`コンテナでlibstdc++のバージョンを確認すると、確かに`libstdc++.so.6.0.28`がインストールされていた。

```sh:sh
cat /etc/os-release 

NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.12.3
PRETTY_NAME="Alpine Linux v3.12"
HOME_URL="https://alpinelinux.org/"
BUG_REPORT_URL="https://bugs.alpinelinux.org/"

ls -lav /usr/lib | grep libstdc++.so
lrwxrwxrwx    1 root     root            19 Oct 19  2022 libstdc++.so -> libstdc++.so.6.0.28
lrwxrwxrwx    1 root     root            19 Oct 19  2022 libstdc++.so.6 -> libstdc++.so.6.0.28
-rwxr-xr-x    1 root     root       1657328 May 18  2020 libstdc++.so.6.0.28 < これ


# apk infoで確認すると-9.3.0-r2なのでバージョン満たしているかと思いきや
# これはGCCバージョンで、libstdc++.soのバージョンニングではない
apk info libstdc++
libstdc++-9.3.0-r2 description:
GNU C++ standard runtime library

libstdc++-9.3.0-r2 webpage:
https://gcc.gnu.org

libstdc++-9.3.0-r2 installed size:
1724416
```

## 対策

### 応急処置

`libstdc++`のアップデートによる影響が未知過ぎるため、まずはVsCodeのダウングレードで凌ぐ。[vscideの公式アーカイブ](https://code.visualstudio.com/updates/v1_76)から直前の`vscode - v1.76`バイナリを取得して置き換えたら復帰した。VsCodeが自動更新される度にまた戻してやる必要があるが、今後奇跡的にパッチが発明されることを願って旧バージョンで凌ぐことにした。

### ためだ

これこれ1年くらい粘って旧バージョンで凌いだが、いよいよ機能拡張やらバージョン互換が切れ出して辛くなってきたので対応する。

### alpineイメージを移行する

> The issue here is from nodejs binary ~[nodejs/node\#41058](https://github.com/nodejs/node/issues/41058)~, **~[@hamad-9](https://github.com/hamad-9)~** is it possible for you update to >=alpine-3.15 as base image ?
> 
> Thank you, it's finally worked. I updated the base image to python:3.9-alpine3.18.
[Container Build Failed - An error occurred setting up the container. · Issue #8450 · microsoft/vscode-remote-release · GitHub](https://github.com/microsoft/vscode-remote-release/issues/8450)

こちらの公式フォーラムによると`alpine - v3.15`が互換要件のalpineバージョンとのこと。

要件を満たしつつ、`php:7.2-fpm-alpine`から最も近いイメージ[Docker | php:7.3-fpm-alpine3.15](https://hub.docker.com/layers/library/php/7.3-fpm-alpine3.15/images/sha256-d0494f03d38e50e69a48acab4480f3a459af7ff3693909e888b05d3839c7e944?context=explore)を試したが変化がなかった。
もうひとつアップストリームの`php:7.4-fpm-alpine3.16`だと`vscode-server`の起動に無事成功して、DevContainer拡張で接続することが出来た。

なお、`libstdc++`の場合は`v6.0.29`がインストールされていた。`v6.0.29` ~ `v6.0.30`間の互換性があるようだ。

```sh
cat /etc/os-release 
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.16.3
PRETTY_NAME="Alpine Linux v3.16"
HOME_URL="https://alpinelinux.org/"
BUG_REPORT_URL="https://gitlab.alpinelinux.org/alpine/aports/-/issues"

ls -lav /usr/lib | grep libstdc++.so
lrwxrwxrwx    1 root     root            19 Jan 25 09:11 libstdc++.so -> libstdc++.so.6.0.29
lrwxrwxrwx    1 root     root            19 Jan 25 09:11 libstdc++.so.6 -> libstdc++.so.6.0.29
-rwxr-xr-x    1 root     root       1952104 Apr 11  2022 libstdc++.so.6.0.29
```