Docker 内使用Claude Code

在使用 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 的权限机制困扰,不妨尝试这种方式,往往会有明显的体验提升。

相关推荐
XIAOHEZIcode1 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220702 天前
如何搭建本地yum源(上)
运维
武子康2 天前
调查研究-183 Apple container:Mac 上用轻量 VM 跑 Linux 容器,Swift 会改写本地容器体验吗?
docker·容器·apple
大树885 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠5 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质5 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工5 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
Alsn865 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker
酣大智5 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_5 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化