Claude CodeをDev Containerで起動するとinit-firewall.shで落ちる問題の対処法
背景
ここまで騒がれていながら未だにClaude Codeを触ったことなかったので、危機感が出てきて流石に触ってみようと重い腰を上げました。
ローカルを汚したくなかったため、コンテナで起動できないのか調べたところ、公式が.devcontainerを用意していました。
ちなみに、もうちょっと調べてみると
- ファイル操作を伴うため安全な実行環境が推奨されている
- CI/CDではDev Containerでの利用が想定されている
とのことなので尚更コンテナで起動したくなりました。
インストール不要で簡単に起動できそうでしたが、コンテナが起動せず少しだけハマってしまいました。
起動までにやったこと
シンプルにgit cloneしてDev Containersを立ち上げただけです。
- git clone
# ディレクトリ作成
cd ~/workspace/github.com; mkdir anthropics
# ディレクトリ移動
cd anthropics
# 公式リポジトリのクローン
git clone https://github.com/anthropics/claude-code.git
# ディレクトリ移動
cd claude-code
-
Docker Desktopの起動
-
Dev Containersの起動
Ctrl + Shift + Pでコマンドパレットを開いて、Dev Containers: Open Folder in Containerからclaude-codeフォルダを選択します。
遭遇したエラー
[149990 ms] postStartCommand from devcontainer.json failed with exit code 1. Skipping any further user-provided commands.
[149994 ms] Error: Command failed: /bin/sh -c sudo /usr/local/bin/init-firewall.sh
まずはdevcontainer.jsonのpostStartCommandとやらが失敗していることが分かりました。
init-firewall.shも失敗していそうです。
{
"name": "Claude Code Sandbox",
略
"postStartCommand": "sudo /usr/local/bin/init-firewall.sh",
略
}
devcontainer.jsonからpostStartCommandを探してみるとpostStartCommand=init-firewall.shであることが分かりました。
[147098 ms] Start: Run in container: /bin/sh -c sudo /usr/local/bin/init-firewall.sh
/bin/bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
No Docker DNS rules to restore
Fetching GitHub IP ranges...
Processing GitHub IPs...
Adding GitHub range 4.208.26.197/32
略
Adding 150.171.74.16 for marketplace.visualstudio.com
Adding 150.171.73.16 for marketplace.visualstudio.com
ipset v7.17: Element cannot be added to the set: it's already added
init-firewall.shのログを見ると、ipset v7.17: Element cannot be added to the set: it's already addedが怪しそうでした。
解決策
init-firewall.shを実行しないようにすれば問題ないのですが、デバッグしたくなったので調べたところ、issueに上がっていました。
ipsetで重複するIPを許可していなかったことが原因だったようです。
ipsetはデフォルトだと重複追加でエラーになるため、既存要素を許容するオプションを付与することで解決します。
.devcontainer配下のinit-firewall.shを以下のように修正します。
ipset add allowed-domains "$ip"
ipset add allowed-domains "$ip" -exist
ちなみに、init-firewall.shを修正した後は必ず、Dev Containers: Rebuild and Reopen in Containerでコンテナを起動してください。
Dev Containers: Open Folder in Containerでは変更が反映されません。
今回はこれに気づかず、シェルの修正が反映されない状態で無駄にハマりました。
Discussion