Dev Container Claude Code: Isolasi yang Benar-Benar Kuat

Tambahkan Claude Code Dev Container Feature ke blok features pada .devcontainer/devcontainer.json Anda lalu lakukan rebuild. Ia bekerja dengan apa pun yang mendukung spesifikasi Dev Containers, dan di VS Code atau Codespaces ia juga menambahkan ekstensi Claude Code. Kalau build-nya gagal di Node, tambahkan feature Node di atas feature Claude Code.
Memasang volume di ~/.claude belum cukup sendirian. Claude Code menyimpan akun OAuth, MCP server pribadi, dan kepercayaan per proyek Anda di ~/.claude.json, file terpisah di luar direktori tersebut. Pasang volumenya dan setel juga CLAUDE_CONFIG_DIR ke path yang sama supaya file itu ikut mendarat di dalam volume.
Lebih aman daripada di host, tetapi tidak aman secara umum. Container mengurung eksekusi perintah dan berjalan sebagai pengguna non-root, tetapi sesi yang di-bypass masih bisa mengeluarkan apa pun yang terjangkau di dalam container, termasuk kredensial Claude Code sendiri, dan bisa mengubah file mana pun di workspace yang di-bind-mount, yang muncul di host Anda. Pakai hanya dengan repository tepercaya.
Ia bisa menetapkan default, bukan menegakkan aturan. Claude Code membaca /etc/claude-code/managed-settings.json pada prioritas tertinggi, tetapi Dockerfile yang menyalinnya berada di dalam repository, jadi siapa pun dengan akses tulis bisa menghapus langkah itu. Untuk kebijakan yang tidak bisa dilangkahi engineer, pakai server-managed settings atau sistem manajemen perangkat Anda.
Feature-nya selalu memasang rilis terbaru dan CLI-nya memperbarui diri sendiri, dan tag versi pada feature menyematkan script instalasinya, bukan CLI-nya. Untuk menyematkan dengan benar, pasang versi tetap dari Dockerfile Anda alih-alih memakai feature, lalu setel DISABLE_AUTOUPDATER di containerEnv.

Ringkasan Utama
Menjalankan Claude Code di dalam dev container berarti perintah yang dijalankannya dieksekusi di dalam container, bukan di host, sementara perubahan pada file proyek tetap muncul di repository lokal Anda. Instalasinya satu entri di blok features pada devcontainer.json. Isolasinya nyata tetapi tidak mutlak — ia tidak melindungi kredensial yang tersimpan di dalam container.
Saya me-rebuild sebuah container tiga kali dalam satu sore dan masuk ke Claude Code tiga kali juga, yang persis dua kali lebih banyak daripada yang pantas ditoleransi siapa pun. Saya sudah memasang volume di direktori konfigurasinya, hal yang disarankan semua orang, dan itu sama sekali tidak menolong. Penyebabnya satu file yang tinggal di sebelah direktori itu, bukan di dalamnya.
Dev container adalah cara paling lurus untuk memberi sebuah agent lingkungan yang terbatas, dan sebagian besar panduan berhenti di langkah instalasi. Tulisan ini melewati titik itu: autentikasi yang benar-benar selamat dari rebuild, cara menerapkan kebijakan organisasi di dalam image dan kenapa cara yang paling kentara justru bisa dilangkahi, firewall egress-nya, serta penjelasan jujur tentang apa yang dicakup dan tidak dicakup isolasinya.
Claude Code masuk ke dev container mana pun lewat sebuah feature yang diterbitkan. Konfigurasinya bekerja dengan apa pun yang mendukung spesifikasi Dev Containers — VS Code, GitHub Codespaces, IDE JetBrains, Cursor — dan ketika Anda membuka container-nya di VS Code atau Codespaces, ia juga menambahkan ekstensi Claude Code, yang diabaikan editor lain.
// .devcontainer/devcontainer.json — the whole install.
{
"image": "mcr.microsoft.com/devcontainers/base:ubuntu",
"features": {
"ghcr.io/anthropics/devcontainer-features/claude-code:1.0": {}
}
}
// The :1.0 tag pins the FEATURE'S INSTALL SCRIPT, not the Claude
// Code release. The feature installs the latest CLI, and the CLI
// auto-updates itself inside the container by default.
// If the build stops with "Failed to install Node.js and npm",
// add the Node feature ABOVE the Claude Code one and rebuild:
// "ghcr.io/devcontainers/features/node:1": {}Begitu berjalan, baik panel ekstensi maupun perintah terminal sama-sama berjalan di dalam container dan berbagi direktori konfigurasi yang sama, jadi tidak ada perpecahan antara dua cara memulai sesi. Tag versi pada feature-nya menyematkan script instalasi feature tersebut, bukan rilis CLI-nya, dan itu penting untuk build yang bisa direproduksi serta dibahas lebih jauh di bawah.
Secara default, home directory container dibuang saat rebuild, jadi engineer harus masuk lagi setiap kali. Memasang volume di direktori konfigurasi adalah perbaikan yang paling kentara dan itu belum cukup sendirian, karena Claude Code menyimpan akun OAuth, MCP server pribadi, dan kepercayaan per proyek Anda di file terpisah yang berada di luar direktori tersebut. Pasang volumenya dan arahkan variabel direktori konfigurasi ke path yang sama, supaya file itu ikut mendarat di dalam volume.
// Auth does NOT survive a rebuild by default, and mounting a
// volume at ~/.claude alone is not enough — the OAuth account,
// personal MCP servers and per-project trust live in
// ~/.claude.json, a separate file OUTSIDE that directory.
//
// Mount the volume AND point CLAUDE_CONFIG_DIR at the same path
// so Claude Code writes .claude.json inside the volume too.
"mounts": [
"source=claude-code-config,target=/home/node/.claude,type=volume"
],
"containerEnv": {
"CLAUDE_CONFIG_DIR": "/home/node/.claude"
}
// Replace /home/node with your container's remoteUser home.
// To isolate state per project instead of sharing one volume
// across every repository, put the devcontainer id in the
// source name, as the reference configuration does.Di GitHub Codespaces, direktori konfigurasi bertahan ketika Anda menghentikan lalu menyalakan sebuah codespace tetapi terhapus saat rebuild, jadi konfigurasi yang sama berlaku. Untuk membawa autentikasi lintas codespace sepenuhnya, simpan token berumur panjang yang dihasilkan perintah setup-token, atau sebuah API key, sebagai Codespaces secret — Codespaces mengekspos secret sebagai environment variable di dalam container secara otomatis, jadi tidak ada yang perlu dipasang sama sekali.
Dev container adalah tempat yang nyaman untuk menerapkan kebijakan organisasi, karena image yang sama berjalan di mesin setiap engineer. Claude Code membaca file managed-settings dari path tetap di Linux dan menerapkannya pada prioritas tertinggi dalam hierarki setting, di atas apa pun yang disetel engineer di konfigurasi pribadi maupun direktori proyek.
# Managed settings inside the image. Claude Code reads this
# path on Linux and applies it at the HIGHEST precedence, above
# anything an engineer sets in ~/.claude or the project's .claude.
RUN mkdir -p /etc/claude-code
COPY managed-settings.json /etc/claude-code/managed-settings.json
# But the Dockerfile lives in the repository, so anyone with
# write access can change or delete that step. For policy that
# engineers cannot bypass by editing repository files, deliver
# it through server-managed settings or your MDM instead.
# To pin the CLI version for reproducible builds, skip the
# feature and install a fixed version from the Dockerfile, then:
# "containerEnv": { "DISABLE_AUTOUPDATER": "1" }Kelemahannya layak dinyatakan terus terang: Dockerfile-nya berada di dalam repository, jadi siapa pun dengan akses tulis bisa mengubah atau menghapus langkah yang menyalin file itu. Ini cara bagus untuk membuat konfigurasi default menjadi benar, dan cara buruk untuk membuat sebuah aturan tak bisa dilanggar. Untuk kebijakan yang tidak bisa dilangkahi engineer dengan mengedit file repository, kirimkan lewat server-managed settings atau sistem manajemen perangkat Anda, dan perlakukan penyalinan di Dockerfile sebagai kemudahan, bukan kendali.
Anda bisa membatasi lalu lintas keluar hanya ke domain yang dibutuhkan Claude Code dan toolchain Anda. Container referensinya menyertakan script firewall yang memblokir semua lalu lintas keluar kecuali sebuah allowlist, dan karena menjalankan firewall di dalam container butuh hak tambahan, referensinya memberikan dua kapabilitas jaringan lewat argumen run.
Baik script maupun kapabilitas itu tidak dibutuhkan Claude Code sendiri — Anda bisa meniadakannya sepenuhnya dan mengandalkan kendali jaringan Anda sendiri, dan itu pilihan yang tepat kalau organisasi Anda sudah menegakkan egress pada lapisan yang lebih Anda percayai daripada sebuah script di dalam repository. Yang penting adalah ada sesuatu yang membatasi egress, bukan bahwa script inilah yang melakukannya.
Karena container berjalan sebagai pengguna non-root dan mengurung eksekusi perintah, ia tempat yang bisa dipertahankan untuk berjalan tanpa permission prompt pada pekerjaan tanpa pengawasan. CLI-nya menolak flag bypass ketika dijalankan sebagai root, jadi pastikan remote user-nya akun non-root sebelum berharap itu bekerja sama sekali.
Container bukan batas pengamanan bagi kredensial Anda. Jalankan dengan permission dilewati dan proyek berbahaya bisa mengeluarkan apa pun yang terjangkau di dalam container, termasuk kredensial Claude Code yang tersimpan di direktori konfigurasi. Claude juga bisa mengubah file mana pun di workspace yang di-bind-mount, yang muncul langsung di host Anda. Pakai dev container dengan repository tepercaya, dan hindari memasang secret host seperti kunci SSH atau file kredensial cloud.
Apa yang benar-benar dilindungi sebuah dev container:
| Kekhawatiran | Terlindungi | Kenapa |
|---|---|---|
| Perintah yang menyentuh filesystem host | Ya | Eksekusinya terkurung di dalam container |
| Perubahan pada file proyek Anda | Tidak | Workspace-nya di-bind-mount dan muncul di host Anda |
| Kredensial di dalam container | Tidak | Sesi yang di-bypass bisa menjangkau apa pun di dalam container |
Feature-nya selalu memasang rilis terbaru dan CLI-nya memperbarui diri di dalam container, yang merupakan default tepat untuk sebagian besar tim dan default keliru ketika Anda butuh setiap engineer berada di versi identik:
Kalau Anda menyetel variabel non-essential traffic untuk menolak telemetri, sadari bahwa ia juga mematikan evaluasi feature flag yang menjadi sandaran Remote Control dan beberapa fitur lain. Sesi di container itu memang tidak akan memilikinya, dan kegagalannya terlihat seperti fitur yang hilang alih-alih pilihan kebijakan yang Anda buat. Itu biasanya wajar di container build dan mengejutkan di container pengembangan.
Dev container adalah satu dari beberapa cara membatasi apa yang bisa dilakukan sebuah agent, dan ia satu-satunya yang sekaligus menyelesaikan konsistensi lingkungan — compiler yang sama, versi yang sama, perkakas yang sama untuk semua orang. Fungsi ganda itulah yang membuatnya layak disiapkan bahkan bagi tim yang tidak terutama mengkhawatirkan isolasi.
Kalau Anda ingin lebih sedikit prompt tanpa mematikan pemeriksaan keamanan, auto mode adalah jawaban yang lebih baik daripada flag bypass: ia mengalirkan tool call lewat classifier alih-alih membuang gerbangnya. Dan kalau Anda ingin mencegah engineer memakai flag bypass sama sekali, itu sebuah key di managed settings, bukan sesuatu yang bisa ditegakkan container sendiri.
Setup yang mengakhiri putaran rebuild-lalu-login saya hanya dua baris: sebuah named volume dan variabel direktori konfigurasi yang menunjuk path yang sama. Selebihnya, tulisan ini tentang bersikap presisi soal apa yang Anda dapat dari container itu. Ia memberi setiap engineer lingkungan yang sama dan menjauhkan eksekusi perintah dari host, dan itu bernilai besar. Ia tidak membuat repository yang tak tepercaya jadi aman dijalankan tanpa pengawasan, dan script firewall sebanyak apa pun tidak mengubah itu.
Sumber & bacaan lanjutan