⚠️

Claude CodeをDev Containerで起動するとinit-firewall.shで落ちる問題の対処法

に公開

背景

ここまで騒がれていながら未だにClaude Codeを触ったことなかったので、危機感が出てきて流石に触ってみようと重い腰を上げました。

ローカルを汚したくなかったため、コンテナで起動できないのか調べたところ、公式が.devcontainerを用意していました。

https://code.claude.com/docs/ja/devcontainer

ちなみに、もうちょっと調べてみると

  • ファイル操作を伴うため安全な実行環境が推奨されている
  • CI/CDではDev Containerでの利用が想定されている

とのことなので尚更コンテナで起動したくなりました。

インストール不要で簡単に起動できそうでしたが、コンテナが起動せず少しだけハマってしまいました。

起動までにやったこと

シンプルにgit cloneしてDev Containersを立ち上げただけです。

  1. git clone
# ディレクトリ作成
cd ~/workspace/github.com; mkdir anthropics 
# ディレクトリ移動
cd anthropics 
# 公式リポジトリのクローン
git clone https://github.com/anthropics/claude-code.git
# ディレクトリ移動
cd claude-code
  1. Docker Desktopの起動

  2. 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.jsonpostStartCommandとやらが失敗していることが分かりました。
init-firewall.shも失敗していそうです。

devcontainer.json
{
  "name": "Claude Code Sandbox",

  "postStartCommand": "sudo /usr/local/bin/init-firewall.sh",

}

devcontainer.jsonからpostStartCommandを探してみるとpostStartCommand=init-firewall.shであることが分かりました。

コンテナ起動のエラーログ(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に上がっていました。

https://github.com/anthropics/claude-code/issues/15611

ipsetで重複するIPを許可していなかったことが原因だったようです。

ipsetはデフォルトだと重複追加でエラーになるため、既存要素を許容するオプションを付与することで解決します。

.devcontainer配下のinit-firewall.shを以下のように修正します。

init-firewall.sh修正前
ipset add allowed-domains "$ip"
init-firewall.sh修正後
ipset add allowed-domains "$ip" -exist

ちなみに、init-firewall.shを修正した後は必ず、Dev Containers: Rebuild and Reopen in Containerでコンテナを起動してください。

Dev Containers: Open Folder in Containerでは変更が反映されません。

今回はこれに気づかず、シェルの修正が反映されない状態で無駄にハマりました。

Discussion