Bỏ qua để đến nội dung

Development containers

Bài viết được dịch tự động từ bài viết gốc, chưa được kiểm tra lại bởi con người. Chỉ những bài viết có dấu tick xanh cạnh tiêu đề là đã được kiểm tra.

Một development container (dev container) cho phép định nghĩa một môi trường giống hệt nhau, cô lập mà mọi kỹ sư trong team đều chạy được. Với Claude Code cài trong container đó, các lệnh Claude chạy thực thi bên trong container thay vì trên máy host, trong khi các thay đổi file project vẫn phản ánh vào repository local của bạn.

Trang này gồm hai phần: cài Claude Code vào dev container, sau đó là các chủ đề cấu hình độc lập: lưu xác thực qua các lần rebuild, áp chính sách tổ chức, giới hạn network egress, và chạy không cần permission prompt.

Dev container chạy như một container Docker, trên máy bạn hoặc trên cloud host như GitHub Codespaces. Một editor hỗ trợ chuẩn Dev Containers (VS Code, GitHub Codespaces, JetBrains IDE, Cursor) kết nối tới container đó: bạn duyệt và sửa file trong editor như bình thường, nhưng terminal tích hợp, language server, và build tool đều chạy trong container thay vì trên host. Editor không hỗ trợ dev container (như Vim thuần) không nằm trong workflow này.

Claude Code chạy trong container, nên nó thấy cùng file, dependency, và tool như phần còn lại của toolchain project. Trong VS Code bạn có thể dùng panel extension Claude Code hoặc chạy claude trong terminal tích hợp; cả hai đều chạy trong container và dùng chung cấu hình ~/.claude.

Claude Code cài vào bất kỳ dev container nào qua Claude Code Dev Container Feature.

  1. Tạo hoặc cập nhật devcontainer.json: lưu như .devcontainer/devcontainer.json trong repository, hoặc thêm block features vào file hiện có.

    Tag phiên bản cuối cùng (như :1.0) pin script cài đặt của feature, không pin bản Claude Code - feature luôn cài Claude Code mới nhất, và Claude Code tự auto-update trong container theo mặc định.

    .devcontainer/devcontainer.json
    {
    "image": "mcr.microsoft.com/devcontainers/base:ubuntu",
    "features": {
    "ghcr.io/anthropics/devcontainer-features/claude-code:1.0": {}
    }
    }

    Thay dòng image bằng base image project của bạn, hoặc bỏ nếu file hiện có dùng Dockerfile.

    Feature Claude Code tự cài Node.js nếu base image chưa có. Nếu build lỗi Failed to install Node.js and npm, thêm "ghcr.io/devcontainers/features/node:1": {} vào block features trước feature Claude Code và rebuild.

  2. Rebuild container: mở Command Palette (Cmd+Shift+P trên Mac, Ctrl+Shift+P trên Windows/Linux) và chạy Dev Containers: Rebuild Container. Với tool khác, dùng hành động rebuild tương ứng của tool đó.

  3. Đăng nhập Claude Code: mở terminal trong container đã rebuild, chạy claude, làm theo prompt xác thực.

Prompt xác thực tùy thuộc provider:

Với cloud provider, truyền credential vào container qua biến môi trường (containerEnv, secret Codespaces, hoặc workload identity của cloud) thay vì mount file credential từ host.

Lưu xác thực và settings qua các lần rebuild

Phần tiêu đề “Lưu xác thực và settings qua các lần rebuild”

Mặc định, thư mục home của container bị xóa khi rebuild, nên kỹ sư phải đăng nhập lại mỗi lần. Claude Code lưu token xác thực, user settings, và lịch sử session dưới thư mục ~/.claude. Nó lưu tài khoản OAuth, MCP server cá nhân, và trust theo project trong ~/.claude.json - một file riêng ngoài thư mục đó - nên chỉ mount volume ở ~/.claude không giữ được đăng nhập. Mount một named volume vào ~/.claude và đặt CLAUDE_CONFIG_DIR cùng đường dẫn đó để Claude Code ghi .claude.json vào trong volume.

devcontainer.json
"mounts": [
"source=claude-code-config,target=/home/node/.claude,type=volume"
],
"containerEnv": {
"CLAUDE_CONFIG_DIR": "/home/node/.claude"
}

Thay /home/node bằng home directory của remoteUser trong container bạn. Để cô lập state theo từng project thay vì dùng chung một volume cho mọi repository, thêm biến ${devcontainerId} vào tên source.

Trong GitHub Codespaces, ~/.claude giữ nguyên khi stop/start codespace nhưng bị xóa khi rebuild container, nên cấu hình trên vẫn cần áp dụng ở đó.

Để mang xác thực qua nhiều codespace, lưu ANTHROPIC_API_KEY hoặc CLAUDE_CODE_OAUTH_TOKEN (từ claude setup-token) như một Codespaces secret.

Dev container là nơi thuận tiện để áp chính sách tổ chức, vì cùng image và cấu hình chạy trên máy mọi kỹ sư.

Claude Code đọc /etc/claude-code/managed-settings.json trên Linux và áp dụng ở độ ưu tiên cao nhất trong hệ thống settings, nên giá trị ở đó ghi đè bất cứ gì kỹ sư đặt ở ~/.claude hoặc thư mục .claude/ của project. Copy file này từ Dockerfile:

Dockerfile
RUN mkdir -p /etc/claude-code
COPY managed-settings.json /etc/claude-code/managed-settings.json

Vì Dockerfile nằm trong repository, ai có quyền ghi cũng có thể đổi hoặc xóa bước này. Với chính sách mà kỹ sư không thể bỏ qua bằng cách sửa file repository, đưa managed settings qua server-managed settings hoặc MDM thay vào đó.

Để đặt biến môi trường áp dụng cho mọi session Claude Code trong container, thêm vào containerEnv trong devcontainer.json. Ví dụ dưới đây tắt telemetry và error reporting, và ngăn Claude Code tự auto-update sau khi cài:

devcontainer.json
"containerEnv": {
"CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1",
"DISABLE_AUTOUPDATER": "1"
}

Dev Container Feature luôn cài bản Claude Code mới nhất. Để pin một phiên bản cụ thể cho build tái lập được, cài từ Dockerfile bằng npm install -g @anthropic-ai/claude-code@X.Y.Z thay vì dùng feature, và đặt DISABLE_AUTOUPDATER như trên.

Để MCP server khả dụng trong container, định nghĩa chúng ở project scope trong file .mcp.json tại root repository để được checkin cùng cấu hình dev container. Cài mọi binary mà local stdio server phụ thuộc trong Dockerfile, và thêm domain của remote server vào network allowlist.

Bạn có thể giới hạn traffic ra ngoài của container chỉ tới các domain Claude Code cần. Xem Yêu cầu truy cập mạng cho danh sách domain inference và xác thực.

Container tham chiếu của Anthropic có script init-firewall.sh chặn mọi traffic ra ngoài trừ các domain Claude Code và dev tool cần. Chạy firewall trong container cần thêm quyền, nên bản tham chiếu thêm capability NET_ADMINNET_RAW qua runArgs. Script firewall và các capability này không bắt buộc với bản thân Claude Code - bạn có thể bỏ qua và dùng kiểm soát mạng riêng.

Vì container chạy Claude Code với user không phải root và giới hạn thực thi lệnh trong container, bạn có thể truyền --dangerously-skip-permissions để chạy không giám sát. CLI từ chối flag này khi chạy với root, nên xác nhận remoteUser là tài khoản không phải root.

Bỏ qua permission prompt nghĩa là bạn mất cơ hội xem lại tool call trước khi chạy. Claude vẫn có thể sửa mọi file trong workspace bind-mount (xuất hiện trực tiếp trên host của bạn) và chạm tới bất cứ gì chính sách mạng của container cho phép. Kết hợp flag này với giới hạn network egress ở trên để hạn chế phạm vi ảnh hưởng của một session bị bypass.

Nếu muốn ít prompt hơn mà không tắt kiểm tra an toàn, cân nhắc auto mode thay thế - có một classifier xem xét hành động trước khi chạy. Để ngăn kỹ sư dùng --dangerously-skip-permissions hoàn toàn, đặt permissions.disableBypassPermissionsMode thành "disable" trong managed settings.

Repository anthropics/claude-code có một dev container mẫu kết hợp CLI, firewall egress, volume bền vững, và shell Zsh. Đây là ví dụ hoạt động chứ không phải base image được duy trì liên tục - dùng để xem các phần khớp với nhau ra sao trước khi áp vào cấu hình của bạn.

Ba file chính trong cấu hình tham chiếu:

FileMục đích
devcontainer.jsonVolume mount, capability runArgs, extension VS Code, và containerEnv
DockerfileBase image, dev tool, và cài Claude Code
init-firewall.shChặn mọi traffic ra ngoài trừ domain được phép
  • Bảo mật: cách hệ thống permission, sandbox, và chống prompt injection của Claude Code kết hợp với nhau.
  • Server-managed settings: đưa chính sách quản lý từ Claude.ai admin console để kỹ sư không thể bỏ qua bằng cách sửa file repository.
  • Giám sát usage: export metric OpenTelemetry và xem lại team đang chạy gì.