在使用 Claude Code 的过程中,我遇到一个非常崩溃的问题,那就是权限控制过于严格。
在实际使用时,几乎每一步操作都会触发确认提示,例如读取文件、写入计划文档、执行脚本等。更让人困扰的是,即使对同一类操作已经授权,后续仍然会被反复询问,严重影响使用体验和效率。
查阅资料后发现,Claude Code 新版本引入了所谓的 Auto Mode ,即通过模型自动判断当前操作是否具有风险,从而减少人工确认。但这个特性存在明显限制:仅对 Claude 订阅用户开放,且需要使用 Opus 模型。对我们国内用户来说,几乎不可用。
Claude Code 还提供了一种比较激进的参数 --dangerously-skip-permissions 。开启后,可以跳过权限确认,直接执行潜在危险操作。虽然这极大提升了效率,但也引入了安全隐患,一旦执行错误命令,可能直接影响系统。
因此,一个更折中的方案是:将 Claude Code 运行在 Docker 容器中。
这样可以实现:
-
✅ 跳过权限确认,提高执行效率
-
✅ 将风险限制在容器内部,不影响 host 系统
-
✅ 在安全性与效率之间取得平衡
在容器中运行 Claude Code 时,需要考虑一个关键问题:
Claude Code 的配置(模型、插件、SKILL 等)是否需要单独在容器内维护?
这里更推荐的做法是:与宿主机共享配置目录。
这样做的好处包括:
-
避免重复配置,提高开发效率
-
多个项目可以复用同一套 Claude Code 环境
-
保持 host 与 container 行为一致,降低调试成本
为此,我写了如下 Dockerfile,基于 Debian 12,包含常用开发工具及 Claude Code 运行环境:
go
FROM debian:12
ENV DEBIAN_FRONTEND=noninteractive
RUN rm -f /etc/apt/sources.list.d/debian.sources \
&& echo "deb http://mirrors.aliyun.com/debian bookworm main contrib non-free non-free-firmware" > /etc/apt/sources.list \
&& echo "deb http://mirrors.aliyun.com/debian bookworm-updates main contrib non-free non-free-firmware" >> /etc/apt/sources.list \
&& echo "deb http://mirrors.aliyun.com/debian-security bookworm-security main contrib non-free non-free-firmware" >> /etc/apt/sources.list
# 基础工具
RUN apt-get update && apt-get install -y \
curl \
git \
ca-certificates \
build-essential \
python3 \
python3-pip \
nodejs \
npm \
debhelper \
devscripts \
llvm-19 \
lld-19 \
clang-19 \
clang-format-19 \
libclang-rt-19-dev \
libc++-19-dev \
rustc-web \
bindgen \
rustfmt-web \
python3 \
pkgconf \
ninja-build \
python3-jinja2 \
python3-pkg-resources \
ca-certificates \
wget \
flex \
yasm \
xvfb \
wdiff \
gperf \
bison \
nodejs \
node-rollup-plugin-terser \
rollup \
valgrind \
esbuild \
xz-utils \
xcb-proto \
xfonts-base \
libdav1d-dev \
libx11-xcb-dev \
libxshmfence-dev \
libgl-dev \
libglu1-mesa-dev \
libegl1-mesa-dev \
libgles2-mesa-dev \
libopenh264-dev \
generate-ninja \
mesa-common-dev \
rapidjson-dev \
libva-dev \
libxt-dev \
libgbm-dev \
libpng-dev \
libxss-dev \
libelf-dev \
libpci-dev \
libcap-dev \
libffi-dev \
libkrb5-dev \
libexif-dev \
libflac-dev \
libudev-dev \
libpipewire-0.3-dev \
libpthreadpool-dev \
libopus-dev \
libxtst-dev \
libjpeg-dev \
libgtk-3-dev \
liblcms2-dev \
libpulse-dev \
libpam0g-dev \
libdouble-conversion-dev \
libxnvctrl-dev \
libglib2.0-dev \
libasound2-dev \
libsecret-1-dev \
libspeechd-dev \
libminizip-dev \
libhunspell-dev \
libharfbuzz-dev \
libxcb-dri3-dev \
libusb-1.0-0-dev \
libopenjp2-7-dev \
libnss3-dev \
libnspr4-dev \
libcups2-dev \
libevdev-dev \
libgcrypt20-dev \
libcurl4-openssl-dev \
libzstd-dev \
fonts-ipafont-gothic \
fonts-ipafont-mincho \
&& rm -rf /var/lib/apt/lists/*
# 可选:升级 node(Debian 自带较旧)
RUN npm install -g n
RUN n stable
# 安装 Claude Code CLI(示例,按你实际工具调整)
# 假设是 npm 包
RUN npm install -g @anthropic-ai/claude-code
RUN wget https://github.com/junjiangao/ccode/releases/latest/download/ccode-linux-x86_64
RUN chmod +x ccode-linux-x86_64
RUN mv ccode-linux-x86_64 /usr/local/bin/ccode
RUN apt-get update && apt-get install -y \
sudo \
cmake \
golang-go \
libunwind-dev \
&& rm -rf /var/lib/apt/lists/*
RUN wget https://go.dev/dl/go1.26.1.linux-amd64.tar.gz
RUN tar -C /usr/local -xzf go1.26.1.linux-amd64.tar.gz
# 添加用户
ARG USER=uos
ARG UID=1000
RUN useradd -m -u $UID -s /bin/bash $USER && echo "$USER ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
# 设置默认工作目录
WORKDIR /work
# 切换为非 root 用户
USER $USER
ENV PATH="/usr/local/go/bin:${PATH}"
CMD [ "bash" ]
然后在启动脚本中,通过 -v 参数将宿主机目录映射到容器中:
go
docker run -it \
-v /work:/work \
-v /home/uos/.config/ccode:/home/uos/.config/ccode \
-v /home/uos/.claude:/home/uos/.claude \
-v /home/uos/.claude.json:/home/uos/.claude.json \
debian/12:latest
重点在于以下几个目录:
-
~/.claude:插件、SKILL、模型配置 -
~/.claude.json:全局配置
通过映射后,容器内无需重复配置 Claude Code 环境。
默认情况下,Docker 容器以内的用户为 root。如果直接使用 root 运行 Claude Code,会带来一个问题:
容器内生成的文件在宿主机上可能归属 root,影响协作和后续操作。
为了解决这一问题,我在 Dockerfile 中创建了一个与宿主机一致的用户(相同 UID/GID),并切换到该用户运行:
go
ARG USER=uos
ARG UID=1000
RUN useradd -m -u $UID -s /bin/bash $USER && echo "$USER ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
USER $USER
这样可以确保:
-
容器与宿主机文件权限一致
-
避免 root 权限文件污染工作目录
-
更符合实际开发环境
小结
通过 Docker 对 Claude Code 进行隔离,本质上是在构建一个受控的高权限执行环境:
-
利用
--dangerously-skip-permissions提升效率 -
借助容器隔离降低风险
-
通过配置共享与用户对齐保证可用性
这套方案在实际使用中非常稳定,尤其适合需要频繁执行自动化任务或 AI Agent 的开发场景。
如果你也被 Claude Code 的权限机制困扰,不妨尝试这种方式,往往会有明显的体验提升。