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

相关推荐
12345,catch a tiger4 分钟前
虚拟机ubuntu安装Vmware Tools
linux·运维·ubuntu
不是书本的小明2 小时前
K8S应用优化方向
网络·容器·kubernetes
程序猿编码2 小时前
一个授予普通进程ROOT权限的Linux内核级后门:原理与实现深度解析
linux·运维·服务器·内核·root权限
小夏子_riotous2 小时前
openstack的使用——9. 密钥管理服务Barbican
linux·运维·服务器·系统架构·centos·云计算·openstack
梦想的旅途23 小时前
自动化运营如何防封?解析 API 协议下的拟人化风控算法
运维·自动化
AC赳赳老秦4 小时前
OpenClaw text-translate技能:多语言批量翻译,解决跨境工作沟通难题
大数据·运维·数据库·人工智能·python·deepseek·openclaw
andeyeluguo4 小时前
docker总结
运维·docker·容器
w6100104664 小时前
cka-2026-etcd
运维·服务器·etcd·cka
SuAluvfy4 小时前
从 0 到 1:在 Windows + Docker 环境下搭建 NextChat 并接入多模型 API(踩坑实录)
docker·容器
九英里路4 小时前
cpp容器——string模拟实现
java·前端·数据结构·c++·算法·容器·字符串