Skip to content

Commit c115e26

Browse files
Slim/0.0.16 (#250)
* Use raw docker.sock for hidden containers * Update to 0.0.16
1 parent daac548 commit c115e26

File tree

6 files changed

+73
-34
lines changed

6 files changed

+73
-34
lines changed

runbook.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ docker pull mcp/docker:prerelease
2020

2121
```sh
2222
# docker:command=build-release
23-
VERSION="0.0.15"
23+
VERSION="0.0.16"
2424
docker buildx build \
2525
--builder hydrobuild \
2626
--platform linux/amd64,linux/arm64 \

src/docker.clj

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,12 @@
106106
{:raw-args ["--unix-socket" (get-backend-socket)]
107107
:throw false}))
108108

109+
(defn backend-get-version [_]
110+
(curl/get
111+
"http://localhost/versions"
112+
{:raw-args ["--unix-socket" (get-backend-socket)]
113+
:throw false}))
114+
109115
(comment
110116
(let [pat (string/trim (slurp "/Users/slim/.secrets/dockerhub-pat-ai-tools-for-devs.txt"))]
111117
(pull-image {:image "vonwig/go-linguist:latest"
@@ -116,8 +122,13 @@
116122
(defn list-containers [m]
117123
(curl/get
118124
"http://localhost/containers/json"
119-
{:raw-args ["--unix-socket" "/var/run/docker.sock"]
120-
:throw false}))
125+
{:raw-args ["--unix-socket" (let [f (fs/file "/var/run/docker.raw.sock")
126+
macos (fs/file (format "%s/Library/Containers/com.docker.docker/Data/docker.raw.sock" (System/getenv "HOME")))]
127+
(cond (.exists f) "/var/run/docker.raw.sock"
128+
(.exists macos) (format "%s/Library/Containers/com.docker.docker/Data/docker.raw.sock" (System/getenv "HOME"))
129+
:else "/var/run/docker.sock"))]
130+
:throw false
131+
:query-params {:filters (json/generate-string m)}}))
121132

122133
(defn list-images [m]
123134
(curl/get
@@ -172,6 +183,7 @@
172183
;; Tty wraps the process in a pseudo terminal
173184
;; StdinOnce closes the stdin after the first client detaches
174185
;; OpenStdin just opens stdin
186+
(declare secrets-get)
175187
(defn create-container [{:keys [image entrypoint workdir command host-dir
176188
environment thread-id opts mounts volumes
177189
ports network_mode secrets labels]
@@ -188,9 +200,10 @@
188200
{:Labels (->> (concat
189201
(->> secrets
190202
keys
191-
(map (fn [secret-key]
192-
(let [s (name secret-key)]
193-
[(format "x-secret:%s" s) (string/trim (format "/secret/%s" s))]))))
203+
(mapcat (fn [secret-key]
204+
(let [s (name secret-key)]
205+
(when (secrets-get (name secret-key))
206+
[[(format "x-secret:%s" s) (string/trim (format "/secret/%s" s))]])))))
194207
(seq labels))
195208
(into {}))}
196209
{:HostConfig
@@ -296,6 +309,12 @@
296309
{:raw-args ["--unix-socket" "/var/run/docker.sock"]
297310
:throw false}))
298311

312+
(defn stop-container [{:keys [Id]}]
313+
(curl/post
314+
(format "http://localhost/containers/%s/stop" Id)
315+
{:raw-args ["--unix-socket" "/var/run/docker.sock"]
316+
:throw false}))
317+
299318
(defn ->json [response]
300319
(json/parse-string (:body response) keyword))
301320

@@ -308,6 +327,7 @@
308327
(def is-logged-in? (comp ->json (status? 200 "backend-is-logged-in") backend-is-logged-in?))
309328
(def get-token (comp ->json (status? 200 "backend-get-token") backend-get-token))
310329
(def get-login-info (comp ->json (status? 200 "backend-login-info") backend-login-info))
330+
(def get-versions (comp ->json (status? 200 "backend-get-versions") backend-get-version))
311331
(def create (comp ->json (status? 201 "create-container") create-container))
312332
(def thread-volume (comp (status? 201 "create-volume") create-volume))
313333
(def delete-thread-volume (comp (status? 204 "remove-volume") remove-volume))

src/extension/docker-compose.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
services:
22
mcp_docker:
3-
image: mcp/docker:0.0.15
3+
image: mcp/docker:0.0.16
44
ports:
55
- 8811:8811
66
volumes:
77
- "/var/run/docker.sock:/var/run/docker.sock"
8+
- "/var/run/docker.raw.sock:/var/run/docker.raw.sock"
89
- "/run/host-services/backend.sock:/backend.sock"
910
- "/run/guest-services/jfs.sock:/jfs.sock"
1011
- "docker-prompts:/prompts"

src/git.clj

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,8 @@
5959
(merge
6060
{:image "alpine/git:latest"
6161
:command (concat ["reset" "--hard"]
62-
(if ref [(format "origin/%s" ref)] ["origin/main"]))}
62+
(if ref [(format "origin/%s" ref)] ["origin/main"]))
63+
:timeout 60000}
6364
(if (string/starts-with? (str dir) "/prompts")
6465
{:workdir (str dir)
6566
:volumes ["docker-prompts-git:/git"
@@ -72,7 +73,8 @@
7273
(merge
7374
{:image "alpine/git:latest"
7475
:command (concat ["pull" "origin"]
75-
(when ref [ref]))}
76+
(when ref [ref]))
77+
:timeout 60000}
7678
(if (string/starts-with? (str dir) "/prompts")
7779
{:workdir (str dir)
7880
:volumes ["docker-prompts-git:/git"
@@ -83,7 +85,8 @@
8385
(defn clone [{:keys [dir owner repo ref ref-hash]}]
8486
(docker/run-container
8587
(merge
86-
{:image "alpine/git:latest"}
88+
{:image "alpine/git:latest"
89+
:timeout 60000}
8790
(if (string/starts-with? (str dir) "/prompts")
8891
{:workdir (str dir)
8992
:volumes ["docker-prompts-git:/git"

src/jsonrpc/prompt_change_events.clj

Lines changed: 37 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,15 @@
5151
(defn init-dynamic-prompt-watcher [opts registry-updated markdown-tool-updated]
5252
(let [change-events-channel (async/chan)
5353
debounced (debounce-by change-events-channel content)]
54+
(doseq [container (docker/containers {:label ["com.docker.desktop.extension=true"
55+
"com.docker.mcp.watch-service=true"]
56+
:name ["com.docker.mcp.watch-service"]})]
57+
(logger/info "shutting down previous vonwig/inotifywait container" (:name container))
58+
(try
59+
(docker/stop-container container)
60+
(docker/kill-container container)
61+
(catch Throwable _
62+
(logger/warn "unable to kill conainer " (:Id container)))))
5463
;; debounce the change event channel
5564
(async/go-loop
5665
[evt (async/<! debounced)]
@@ -60,28 +69,34 @@
6069
:unknown)
6170
(recur (async/<! debounced)))
6271
;; watch filesystem
63-
(let [{x :container}
64-
(docker/run-streaming-function-with-no-stdin
65-
{:image "vonwig/inotifywait:latest"
66-
:labels {"com.docker.desktop.service" "true"}
67-
:volumes ["docker-prompts:/prompts"]
68-
:command ["-e" "create" "-e" "modify" "-e" "delete" "-q" "-m" "/prompts"]}
69-
(fn [line]
70-
(let [[_dir _event f] (string/split line #"\s+")]
71-
(async/put!
72-
change-events-channel
73-
(cond
74-
(= f "registry.yaml")
75-
{:opts opts :f f :type :registry}
76-
(string/ends-with? f ".md")
77-
{:opts opts :f f :type :markdown}
78-
:else
79-
{})))))]
80-
(shutdown/schedule-container-shutdown
81-
(fn []
82-
(logger/info "inotifywait shutting down")
83-
(docker/kill-container x)
84-
(docker/delete x))))))
72+
(try
73+
(let [{x :container}
74+
(docker/run-streaming-function-with-no-stdin
75+
{:image "vonwig/inotifywait:latest"
76+
:labels {"com.docker.desktop.extension" "true"
77+
"com.docker.mcp.watch-service" "true"
78+
"com.docker.compose.project" "docker_labs-ai-tools-for-devs-desktop-extension"
79+
"com.docker.compose.service" "registry-watcher"}
80+
:volumes ["docker-prompts:/prompts"]
81+
:command ["-e" "create" "-e" "modify" "-e" "delete" "-q" "-m" "/prompts"]}
82+
(fn [line]
83+
(let [[_dir _event f] (string/split line #"\s+")]
84+
(async/put!
85+
change-events-channel
86+
(cond
87+
(= f "registry.yaml")
88+
{:opts opts :f f :type :registry}
89+
(string/ends-with? f ".md")
90+
{:opts opts :f f :type :markdown}
91+
:else
92+
{})))))]
93+
(shutdown/schedule-container-shutdown
94+
(fn []
95+
(logger/info "inotifywait shutting down")
96+
(docker/kill-container x)
97+
(docker/delete x))))
98+
(catch Throwable t
99+
(logger/error "unable to start registry.yaml watcher" t)))))
85100

86101
(comment
87102
(repl/setup-stdout-logger)

src/jsonrpc/server.clj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,7 @@
404404
:out-chan-factory io-chan/mcp-output-stream->output-chan})))))
405405

406406
(defn run-socket-server! [opts server-opts]
407-
(logger/info "Starting socket server on" (:port opts))
407+
(logger/info (format "Starting socket server (docker version %s) on port %s" (:appVersion (docker/get-versions {})) (:port opts)))
408408
(socket-server/server (merge opts server-opts)))
409409

410410
(defn run-server! [opts server-opts]
@@ -414,7 +414,7 @@
414414
server-opts
415415
{:in (or (:in opts) System/in)
416416
:out System/out}))]
417-
(logger/info "Starting server...")
417+
(logger/info (format "Starting server (docker version %s)..." (:appVersion (docker/get-versions {}))))
418418
;; only on lsp.server/start will the stdio channels start being used
419419
(let [server-id (swap! jsonrpc.state/server-counter inc)
420420
{:keys [producer] :as context}

0 commit comments

Comments
 (0)