Ubuntu Weekly Recipe

第921回Canonical Workshopでコーディングエージェントの実行環境を作る

Claude CodeやCodexのようなコーディングエージェントは便利ですが、ホームディレクトリを破壊したりといった怖い話も聞きますよね。今回はCanonicalがリリースしたWorkshopというツールでサンドボックス環境を構築し、ホスト環境を守りながらコーディングエージェントを動作させる方法を紹介します。

Workshopとは

Workshopとは、Ubuntuを開発しているCanonical社がリリースした、開発環境のサンドボックスをUbuntu等の環境に作成するツールです。

workshopコマンドを実行するとサンドボックスを作成でき、そのサンドボックス内でコーディングエージェントを動作させることで、コーディングエージェントの非決定的な挙動からホスト側OSへの影響を抑えられます。

また、環境の設定はYAMLによって定義できるため、Gitレポジトリ等に設定ファイルを配置しておけば、各開発者のPCで同じ環境を作成できます。

Workshopの特徴

設定ファイルで環境を作るだけなら、例えばDockerでもいいのではないかと思われる方もいると思います。Docker等と比較した場合のWorkshopの大きな特徴は、システムコンテナで動作することです。

Dockerに代表されるようなアプリケーションコンテナは一般に、Node.jsアプリケーションやGoの実行バイナリのような、特定のアプリケーションと依存関係をまとめる用途を中心に使われます。一方で、WorkshopはLXDのコンテナを利用しており、システムコンテナとしてUbuntuのOS環境(ユーザー空間)が一式動作します。

このOS環境が一式入っているという特徴により、ユーザーがサンドボックス内の環境構築を行いやすく、作業もしやすい環境を作れます。開発環境では、言語Aと言語Bがどちらも必要だったり、様々なツールを入れておいたりしたいものですが、この特徴により複数のライブラリやツールをインストールしやすいです。また、複数のライブラリやツールを入れやすいということは、マルチレポジトリで動作するようなアプリケーションの環境構築にも向いています。

もちろん、アプリケーションコンテナの環境にコーディングエージェントをインストールすることもできますが、Dockerfileのような設定ファイルが複雑になりがちです。

また、Workshopの環境はコンテナでありつつも、Dockerコンテナも簡単に動作させられるため、既存のDockerを利用した環境から移行しやすいのもポイントです。

Workshopのインストール

まず前提の環境ですが、ドキュメント上ではUbuntuの他、snap-enabled Linux distributionとWSL2でも利用可能となっています。筆者はUbuntu 24.04で検証していますので、Ubuntuを前提に記述します。

WorkshopはLXD 6.8+を前提としているため、まず以下のコマンドでLXDをインストールします。

$ sudo snap install --channel=6/stable lxd

あるいは、更新が必要な場合は以下のとおり実行します。

$ sudo snap refresh --channel=6/stable lxd

その後、Workshopをインストールします。

$ sudo snap install --classic workshop

これでインストールは完了です。

macOSのようなUbuntuでない環境でも、Multipassを利用し、仮想マシンを作ることで構築できます。Multipassについては2019年の記事で紹介していますので、こちらを参照ください。筆者もMultipassでセットアップされたUbuntu上でWorkshopを利用しています。

プロジェクトディレクトリとworkshop定義の作成

Workshopでは、各サンドボックスのことを「workshop」と呼んでいます。このworkshopを作るには、YAMLの定義ファイルを作成します。

workshop定義ファイルを作成するには、適当なディレクトリ(プロジェクトディレクトリ)を作成し、その中でworkshop initコマンドを実行します。

以下のコマンド例では、devという名前のworkshopを、Ubuntu 24.04をベースに、node SDKをインストールするものとして定義します。

$ workshop init dev --sdks node --base ubuntu@24.04
"dev" workshop created at /home/yoichi/proj/workshop-demo1/.workshop/dev.yaml

このコマンドを実行すると、.workshop/dev.yamlに以下のようなファイルが出力されます。

name: dev
base: ubuntu@24.04
sdks:
  - name: node

これでworkshop定義ファイルができました。

このあとworkshop launchコマンドを実行すると起動できます。定義がひとつだけの場合は、名前を指定しなくてもそのひとつを探してくれます。

$ workshop launch
"dev" launched
$ workshop list
WORKSHOP  STATUS  NOTES
dev       Ready   -

workshopが立ち上がったら、workshop shellコマンドを実行すると、サンドボックス環境内でシェルが起動します。

$ workshop shell
workshop@dev:/project$ node --version
v24.11.0

サンドボックス環境内では、この.workshopがあるディレクトリが/projectに自動的にマウントされるため、このパスを介してファイルにアクセスできます。

以下は、workshop内でb.txtを作成し、ホスト側からも参照できることを示した例です。

user@myhost:~/shops/ws-sample$ ls -l
合計 4
-rw-rw-r-- 1 user user 4  7月 19 21:48 a.txt   ←元々はa.txtのみ存在している
user@myhost:~/shops/ws-sample$ workshop shell
workshop@dev:/project$ echo foo > b.txt        ←workshop内でファイルを書き込む
workshop@dev:/project$ exit
exit
user@myhost:~/shops/ws-sample$ ls -l
合計 8
-rw-rw-r-- 1 user user 4  7月 19 21:48 a.txt
-rw-rw-r-- 1 user user 4  7月 19 21:49 b.txt   ←ホストに戻ってきても見えている

/projectでアクセスできるということは、プロジェクトディレクトリは保護されないということを意味します。このディレクトリに入るファイル群は、Git管理やバックアップによって保護することをおすすめします。

SDKの追加

次にソフトウェアのインストールについてです。できた環境もUbuntuであるため、もちろんシェルに入ってaptコマンドでもインストールできます。しかし、Workshopにはそれよりも簡単な「SDK」というものがあります。これは、Workshop版のsnapパッケージのようなもので、様々なツールなどをインストールできます。

Go言語の追加

まずはGo言語のコンパイラのインストールを例に説明します。

インストールしたいSDKは、sdk findコマンド及びsdk infoコマンドによって探せます。

$ sdk find go
NAME     VERSION  PUBLISHER            SUMMARY
agy      1.1.2    Rajan Patel          Google Antigravity CLI wrapper SDK for Canonical Workshop
flutter  3.41.6   Canonical✓  Google's UI toolkit for multi-platform apps
go       1.26.3   Canonical✓  The Go programming language

$ sdk info go
name:       go
publisher:  Canonical✓
license:    BSD-3-Clause
website:    https://github.com/canonical/go-sdk

This SDK provides the official Go toolchain for efficient Go
development. Module downloads are persisted on the host to speed up builds
across workshop updates, and Go environment settings are preserved between
workshop updates.

(中略)

CHANNELS
  CHANNEL           VERSION  BUILD       BASE  REV     SIZE
  latest/stable     1.26.3   2026-05-20  all    18  56.07MB
  latest/candidate  ↑                               
  latest/beta       ↑                               
  latest/edge       ↑                               
  1.26/stable       1.26.4   2026-06-22  all    48  56.07MB
  1.26/candidate    ↑                               
  1.26/beta         ↑                               
  1.26/edge         ↑                               
(略)

goというnameのSDKが見つかりました。1.26/stableといったバージョン別のchannelがあることもわかります。

ここまでわかったら、設定ファイルを以下のように書き換えます。

name: dev
base: ubuntu@24.04
sdks:
  - name: node
  - name: go
    channel: 1.26

あとは、workshop refreshコマンドによって設定ファイルのとおりに環境を再構成できます。

$ workshop refresh

以下、毎回の操作となるためworkshop refreshは省略します。

コーディングエージェントの追加

Claude CodeやCodexもSDKとしてインストールできます。

同じようにsdk findで検索し、sdksに追加すればよいです。

name: dev
base: ubuntu@24.04
sdks:
  - name: claude-code

workshop shellでシェルから起動しても良いですが、workshop execでホスト側から直接起動してみてもよいでしょう。

$ workshop exec -- claude --version
2.1.197 (Claude Code)

Dockerの追加

DockerもSDKの追加で利用できます。いわゆるDocker-in-Dockerの設定等を意識することはなく、非常に簡単です。

name: dev
base: ubuntu@24.04
sdks:
  - name: docker-ce
$ workshop shell
workshop@dev:/project$ docker run busybox echo Hello
Hello
workshop@dev:/project$ docker ps -a
CONTAINER ID   IMAGE     COMMAND        CREATED         STATUS                    PORTS     NAMES
c2e0c49861ba   busybox   "echo Hello"   2 seconds ago   Exited (0) 1 second ago             frosty_lewin

VS Code接続の追加

vscode-remote SDKを利用すると、VS Code Remote Development Extension PackがインストールされたVS Codeから接続できます。

name: dev
base: ubuntu@24.04
sdks:
  - name: vscode-remote

SDKをインストール後、workshop infoで接続するホスト名を調べます。

$ workshop info
name:      dev
base:      ubuntu@24.04
project:   ~/shops/ws-sample
hostname:  dev.ws-sample.wp   ←接続するホスト名
(略)

ホスト名がわかったら、VS Codeを起動し、画面左下の「><」アイコンで「Open a Remote Window」を選択後、⁠Connect to Host」を選択します。ここで「workshop@(先程確認したホスト名⁠⁠」を入力すると、接続できます。

このホスト名はLXDとdnsmasqによって名前解決されるため、デフォルトでは、ホスト外からは名前解決できずネットワーク的にも到達できないことに注意してください。

actionを追加する

workshop内でよく使う操作は事前にactionsという形で定義できます。

YAMLに以下のように記述し、workshop run -- lintという形で実行します。

name: dev
base: ubuntu@24.04
sdks:
  - name: node

actions:
  lint: |
    npm run lint
$ workshop run -- lint

筆者としては、Workshopはあくまで環境を提供するものであるため、actionsに記述するのは、例えば初期の準備などworkshopのための操作や、プロジェクト内のスクリプトやタスクランナーへの窓口にとどめるのをおすすめします。

タスクランナーへの窓口とするには、引数を与える形にするのが便利です。引数は、"$@"で利用できます。

name: dev
base: ubuntu@24.04
sdks:
  - name: node

actions:
  npm: |
    npm "$@"
$ workshop run -- npm install

workshopを停止する/削除する

workshopが不要になった場合、workshop stopで停止、workshop removeで削除します。

$ workshop stop
"dev" stopped
$ workshop remove
"dev" removed

なお、設定のYAMLは当然残っているので、workshop remove後でも、workshop launchで起動すれば再び利用できます。

$ workshop launch
"dev" launched

プロジェクト内SDKで環境をカスタマイズする

少し発展的なこととして、SDKを作ることもできます。SDKは配布するほか、プロジェクト内SDK(in-project SDK)も作成でき、ちょっとした調整をするのに便利です。

例えば、2026年7月時点でRubyのSDKはないのですが、プロジェクト内SDKを作成することで、他のSDK同様にworkshop launch時点から使えるようになります。

ここではプロジェクト内SDKを簡易に作成する手順を述べます。詳しいSDKの作成手順については、WorkshopのSketch SDKs tutorialも参照ください。

Rubyを利用可能にするSDKの作成

プロジェクト内SDKを作成するには、まずSDKの名前を決め、.workshop/{SDKの名前}/sdk.yamlを記述します。

ここではSDKの名前をrubyとし、.workshop/ruby/sdk.yamlに以下の内容を記述します。

name: ruby
version: "0.1"
summary: Ruby for local development
description: |
  Project-specific Ruby

さらにsetup-base hookを追加し、SDKのセットアップの際にapt-getを使ってRubyをインストールします。

今回の例では、.workshop/ruby/hooks/setup-baseに以下の内容を記述します。

#!/bin/sh
set -eu

export DEBIAN_FRONTEND=noninteractive

apt-get update
apt-get install -y --no-install-recommends \
  ca-certificates \
  curl \
  rake \
  ruby \
  ruby-dev \
  ruby-bundler

これでプロジェクト内SDKが定義できたので、.workshop/dev.yamlproject-の接頭辞をつけた形(今回はproject-ruby)で記述します。

name: dev
base: ubuntu@24.04
sdks:
  - name: node
  - name: project-ruby

このあと、他のSDK追加と同様にworkshop refreshによってRubyが利用可能になります。


このように、コーディングエージェントのためのサンドボックスを、再現可能な形で動作させられます。Workshop自体のセットアップもお手軽なのでぜひ試してみてください。

おすすめ記事

記事・ニュース一覧