@alchemy.run/docker 0.0.0 → 2.0.0-beta.84

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +46 -4
  3. package/lib/Bootstrap.d.ts +7 -0
  4. package/lib/Bootstrap.d.ts.map +1 -0
  5. package/lib/Bootstrap.js +25 -0
  6. package/lib/Bootstrap.js.map +1 -0
  7. package/lib/BuildHash.d.ts +47 -0
  8. package/lib/BuildHash.d.ts.map +1 -0
  9. package/lib/BuildHash.js +165 -0
  10. package/lib/BuildHash.js.map +1 -0
  11. package/lib/Container.d.ts +352 -0
  12. package/lib/Container.d.ts.map +1 -0
  13. package/lib/Container.js +531 -0
  14. package/lib/Container.js.map +1 -0
  15. package/lib/Context.d.ts +86 -0
  16. package/lib/Context.d.ts.map +1 -0
  17. package/lib/Context.js +146 -0
  18. package/lib/Context.js.map +1 -0
  19. package/lib/Docker.d.ts +448 -0
  20. package/lib/Docker.d.ts.map +1 -0
  21. package/lib/Docker.js +416 -0
  22. package/lib/Docker.js.map +1 -0
  23. package/lib/Dockerfile.d.ts +72 -0
  24. package/lib/Dockerfile.d.ts.map +1 -0
  25. package/lib/Dockerfile.js +12 -0
  26. package/lib/Dockerfile.js.map +1 -0
  27. package/lib/HealthcheckCommand.d.ts +17 -0
  28. package/lib/HealthcheckCommand.d.ts.map +1 -0
  29. package/lib/HealthcheckCommand.js +33 -0
  30. package/lib/HealthcheckCommand.js.map +1 -0
  31. package/lib/Image.d.ts +151 -0
  32. package/lib/Image.d.ts.map +1 -0
  33. package/lib/Image.js +192 -0
  34. package/lib/Image.js.map +1 -0
  35. package/lib/ImageSource.d.ts +234 -0
  36. package/lib/ImageSource.d.ts.map +1 -0
  37. package/lib/ImageSource.js +469 -0
  38. package/lib/ImageSource.js.map +1 -0
  39. package/lib/Network.d.ts +70 -0
  40. package/lib/Network.d.ts.map +1 -0
  41. package/lib/Network.js +111 -0
  42. package/lib/Network.js.map +1 -0
  43. package/lib/Providers.d.ts +21 -0
  44. package/lib/Providers.d.ts.map +1 -0
  45. package/lib/Providers.js +26 -0
  46. package/lib/Providers.js.map +1 -0
  47. package/lib/Registry.d.ts +47 -0
  48. package/lib/Registry.d.ts.map +1 -0
  49. package/lib/Registry.js +67 -0
  50. package/lib/Registry.js.map +1 -0
  51. package/lib/RegistryError.d.ts +21 -0
  52. package/lib/RegistryError.d.ts.map +1 -0
  53. package/lib/RegistryError.js +28 -0
  54. package/lib/RegistryError.js.map +1 -0
  55. package/lib/RemoteImage.d.ts +118 -0
  56. package/lib/RemoteImage.d.ts.map +1 -0
  57. package/lib/RemoteImage.js +164 -0
  58. package/lib/RemoteImage.js.map +1 -0
  59. package/lib/Service.d.ts +478 -0
  60. package/lib/Service.d.ts.map +1 -0
  61. package/lib/Service.js +588 -0
  62. package/lib/Service.js.map +1 -0
  63. package/lib/ServiceImage.d.ts +78 -0
  64. package/lib/ServiceImage.d.ts.map +1 -0
  65. package/lib/ServiceImage.js +162 -0
  66. package/lib/ServiceImage.js.map +1 -0
  67. package/lib/Swarm.d.ts +119 -0
  68. package/lib/Swarm.d.ts.map +1 -0
  69. package/lib/Swarm.js +148 -0
  70. package/lib/Swarm.js.map +1 -0
  71. package/lib/Volume.d.ts +94 -0
  72. package/lib/Volume.d.ts.map +1 -0
  73. package/lib/Volume.js +133 -0
  74. package/lib/Volume.js.map +1 -0
  75. package/lib/index.d.ts +14 -0
  76. package/lib/index.d.ts.map +1 -0
  77. package/lib/index.js +13 -0
  78. package/lib/index.js.map +1 -0
  79. package/package.json +58 -3
  80. package/src/Bootstrap.ts +51 -0
  81. package/src/BuildHash.ts +255 -0
  82. package/src/Container.ts +792 -0
  83. package/src/Context.ts +215 -0
  84. package/src/Docker.ts +1079 -0
  85. package/src/Dockerfile.ts +81 -0
  86. package/src/HealthcheckCommand.ts +35 -0
  87. package/src/Image.ts +293 -0
  88. package/src/ImageSource.ts +769 -0
  89. package/src/Network.ts +169 -0
  90. package/src/Providers.ts +46 -0
  91. package/src/Registry.ts +91 -0
  92. package/src/RegistryError.ts +48 -0
  93. package/src/RemoteImage.ts +255 -0
  94. package/src/Service.ts +1080 -0
  95. package/src/ServiceImage.ts +252 -0
  96. package/src/Swarm.ts +221 -0
  97. package/src/Volume.ts +193 -0
  98. package/src/index.ts +17 -0
package/lib/Service.js ADDED
@@ -0,0 +1,588 @@
1
+ import { Unowned } from "alchemy/AdoptPolicy";
2
+ import { deepEqual, isResolved } from "alchemy/Diff";
3
+ import { Platform } from "alchemy/Platform";
4
+ import * as Provider from "alchemy/Provider";
5
+ import { createContainerRuntimeContext, } from "alchemy/Runtime/Process";
6
+ import { Stack } from "alchemy/Stack";
7
+ import { createInternalTags, hasAlchemyTags } from "alchemy/Tags";
8
+ import * as Effect from "effect/Effect";
9
+ import * as Equal from "effect/Equal";
10
+ import * as Redacted from "effect/Redacted";
11
+ import * as Schedule from "effect/Schedule";
12
+ import { Docker, dockerEngineContextName, dockerPhysicalName } from "./Docker.js";
13
+ import { healthcheckCommand, isHealthcheckDisabled } from "./HealthcheckCommand.js";
14
+ import { makeServiceImage } from "./ServiceImage.js";
15
+ /**
16
+ * A Docker Swarm service: N replicas of a container kept alive by the swarm,
17
+ * deployed through the active (or a named) Docker context.
18
+ *
19
+ * The target engine must be a swarm manager — `Service` wraps
20
+ * `docker service`, swarm mode's orchestration API. Declare the swarm with
21
+ * `Docker.Swarm` and pass it as `context` so the service deploys after the
22
+ * swarm exists; for a plain single container on a non-swarm daemon use
23
+ * `Docker.Container` instead.
24
+ *
25
+ * The service's image comes from one of two sources:
26
+ *
27
+ * - `image` — run a pre-built reference (a registry ref, or a `Docker.Image`
28
+ * / `Docker.RemoteImage` resource).
29
+ * - `main` — bundle an inline Effect program into a generated bun image,
30
+ * built directly against the service's Docker context. The impl returns
31
+ * `{ fetch }` and may register background loops via `ServerHost.run` —
32
+ * the same effectful platform shape as `AWS.ECS.Service`.
33
+ *
34
+ * The bundled image is content-addressed and only rebuilt when the program
35
+ * (or its generated Dockerfile) changes. It is built on the target engine's
36
+ * local store — single-node swarms run it as-is; multi-node swarms need the
37
+ * image on a registry every node can reach (build with `Docker.Image` +
38
+ * `registry` and pass the pushed ref as `image` instead).
39
+ *
40
+ * Only replicated services are supported. Configuration changes replace the
41
+ * service (delete-then-create); swarm tasks are stateless, so replacement is
42
+ * cheap and avoids partially-applied `service update` drift.
43
+ * ### Creating Services
44
+ * **Example:** Replicated Nginx
45
+ * ```typescript
46
+ * const swarm = yield* Docker.Swarm("swarm");
47
+ * const web = yield* Docker.Service("web", {
48
+ * context: swarm,
49
+ * image: "nginx:alpine",
50
+ * replicas: 3,
51
+ * ports: [{ external: 8080, internal: 80 }],
52
+ * });
53
+ * ```
54
+ *
55
+ * **Example:** Run a Built Image
56
+ * ```typescript
57
+ * const image = yield* Docker.Image("app-image", {
58
+ * build: { context: "./app" },
59
+ * });
60
+ * const app = yield* Docker.Service("app", {
61
+ * context: swarm,
62
+ * image,
63
+ * replicas: 2,
64
+ * });
65
+ * ```
66
+ *
67
+ * ### Effectful Services
68
+ * **Example:** Inline Effect Server
69
+ * ```typescript
70
+ * const swarm = yield* Docker.Swarm("swarm");
71
+ * const api = yield* Docker.Service(
72
+ * "Api",
73
+ * {
74
+ * context: swarm,
75
+ * main: import.meta.url,
76
+ * port: 3000,
77
+ * ports: [{ external: 8080, internal: 3000 }],
78
+ * replicas: 2,
79
+ * },
80
+ * Effect.gen(function* () {
81
+ * return {
82
+ * fetch: Effect.gen(function* () {
83
+ * return yield* HttpServerResponse.json({ ok: true });
84
+ * }),
85
+ * };
86
+ * }),
87
+ * );
88
+ * ```
89
+ *
90
+ * **Example:** Background Loops with ServerHost
91
+ * ```typescript
92
+ * // Class props may be an Effect, so the service can yield the swarm it
93
+ * // deploys into (declared once at module level).
94
+ * const Swarm = Docker.Swarm("swarm");
95
+ *
96
+ * export default class Worker extends Docker.Service<Worker>()(
97
+ * "Worker",
98
+ * Effect.gen(function* () {
99
+ * const swarm = yield* Swarm;
100
+ * return { context: swarm, main: import.meta.url, port: 3000 };
101
+ * }),
102
+ * Effect.gen(function* () {
103
+ * const host = yield* ServerHost;
104
+ * yield* host.run(
105
+ * pollQueue.pipe(Effect.repeat(Schedule.spaced("5 seconds")), Effect.asVoid),
106
+ * );
107
+ * return {
108
+ * fetch: Effect.succeed(HttpServerResponse.text("ok")),
109
+ * };
110
+ * }),
111
+ * ) {}
112
+ * ```
113
+ *
114
+ * ### Bundling & Tree-shaking
115
+ * `main` is bundled with rolldown at deploy time. Unused code is
116
+ * tree-shaken. `effect`, alchemy, and `@distilled.cloud` are marked
117
+ * pure so unused parts prune more aggressively. Your app is not
118
+ * marked pure.
119
+ *
120
+ * **Example:** Mark additional packages as pure
121
+ * Only list packages with no top-level side effects.
122
+ * ```typescript
123
+ * {
124
+ * main: import.meta.url,
125
+ * build: {
126
+ * pure: { packages: ["my-lib", "@my-scope/*"] },
127
+ * },
128
+ * }
129
+ * ```
130
+ *
131
+ * **Example:** Turn it off
132
+ * ```typescript
133
+ * {
134
+ * main: import.meta.url,
135
+ * build: { pure: false },
136
+ * }
137
+ * ```
138
+ *
139
+ * ### Docker Contexts
140
+ * **Example:** Deploy to a Remote Swarm over SSH
141
+ * ```typescript
142
+ * const vps = yield* Docker.Context("vps", {
143
+ * docker: "host=ssh://deploy@example.com",
144
+ * });
145
+ * const swarm = yield* Docker.Swarm("swarm", {
146
+ * context: vps,
147
+ * advertiseAddr: "10.0.0.1",
148
+ * });
149
+ * const app = yield* Docker.Service("app", {
150
+ * context: swarm,
151
+ * image: "nginx:alpine",
152
+ * replicas: 3,
153
+ * });
154
+ * ```
155
+ *
156
+ * ### Networks & Volumes
157
+ * **Example:** Overlay Network with Aliases
158
+ * ```typescript
159
+ * const network = yield* Docker.Network("app-net", {
160
+ * context: swarm,
161
+ * driver: "overlay",
162
+ * });
163
+ * const db = yield* Docker.Service("db", {
164
+ * context: swarm,
165
+ * image: "postgres:18-alpine",
166
+ * networks: [{ name: network.name, aliases: ["postgres"] }],
167
+ * volumes: [{ hostPath: "pg-data", containerPath: "/var/lib/postgresql/data" }],
168
+ * });
169
+ * ```
170
+ *
171
+ * ### Rollouts & Placement
172
+ * **Example:** Rolling Update with Rollback
173
+ * ```typescript
174
+ * const app = yield* Docker.Service("app", {
175
+ * image: "ghcr.io/acme/app:latest",
176
+ * replicas: 4,
177
+ * updateConfig: {
178
+ * parallelism: 1,
179
+ * delay: "10s",
180
+ * failureAction: "rollback",
181
+ * order: "start-first",
182
+ * },
183
+ * placement: {
184
+ * constraints: ["node.role==worker"],
185
+ * maxReplicasPerNode: 2,
186
+ * },
187
+ * });
188
+ * ```
189
+ *
190
+ * ### Secrets & Configs
191
+ * **Example:** Mount Swarm Secrets
192
+ * ```typescript
193
+ * const app = yield* Docker.Service("app", {
194
+ * image: "ghcr.io/acme/app:latest",
195
+ * secrets: [{ source: "db-password", target: "db_password", mode: 0o400 }],
196
+ * configs: [{ source: "app-config", target: "/etc/app/config.yaml" }],
197
+ * });
198
+ * ```
199
+ *
200
+ * @resource
201
+ * @product Swarm
202
+ */
203
+ export const Service = Platform("Docker.Service", {
204
+ createRuntimeContext: createContainerRuntimeContext("Docker.Service"),
205
+ });
206
+ /** True when the props declare a bundled `main` program. */
207
+ const isBundledService = (props) => typeof props.main === "string";
208
+ export const ServiceProvider = () => Provider.effect(Service, Effect.gen(function* () {
209
+ const docker = yield* Docker;
210
+ const stack = yield* Stack;
211
+ const serviceImage = yield* makeServiceImage;
212
+ // The bundled program's bootstrap reads these to rebuild the Stack at
213
+ // container runtime (same contract as the ECS bootstrap).
214
+ const alchemyEnv = {
215
+ ALCHEMY_STACK_NAME: stack.name,
216
+ ALCHEMY_STAGE: stack.stage,
217
+ ALCHEMY_PHASE: "runtime",
218
+ };
219
+ const inspect = (id, context) => docker.service.inspect(id, context).pipe(Effect.map((result) => normalizeServiceInspect(result)), Effect.catchReason("PlatformError", "NotFound", () => Effect.undefined));
220
+ /**
221
+ * Resolve the image the service should run: build the bundled `main`
222
+ * program (content-addressed, skipped when already present in the
223
+ * target engine) or normalize the pre-built reference.
224
+ */
225
+ const resolveImage = Effect.fn(function* (id, props, name, context, session) {
226
+ if (isBundledService(props)) {
227
+ return yield* serviceImage.resolve({
228
+ id,
229
+ source: props,
230
+ name,
231
+ context,
232
+ isExternal: props.isExternal,
233
+ session,
234
+ });
235
+ }
236
+ return {
237
+ imageRef: normalizeImageRef(props.image),
238
+ codeHash: undefined,
239
+ };
240
+ });
241
+ return Service.Provider.of({
242
+ list: () => Effect.succeed([]),
243
+ read: Effect.fn(function* ({ id, instanceId, olds, output }) {
244
+ const name = yield* servicePhysicalName(id, olds, instanceId);
245
+ const context = dockerEngineContextName(olds?.context);
246
+ const live = yield* inspect(name, context);
247
+ if (!live)
248
+ return undefined;
249
+ ensureReplicatedMode(live);
250
+ const attrs = toServiceAttributes(live, context, output?.code);
251
+ if (output)
252
+ return attrs;
253
+ const owned = yield* hasAlchemyTags(id, live.Spec.Labels ?? undefined);
254
+ return owned ? attrs : Unowned(attrs);
255
+ }),
256
+ diff: Effect.fn(function* ({ id, instanceId, news, olds, output }) {
257
+ if (!isResolved(news))
258
+ return undefined;
259
+ const oldDesired = yield* normalizeDesired(id, olds, instanceId);
260
+ const newDesired = yield* normalizeDesired(id, news, instanceId);
261
+ if (!Equal.equals(oldDesired, newDesired)) {
262
+ return { action: "replace", deleteFirst: true };
263
+ }
264
+ // Bundled program: the image identity is the content hash — a code
265
+ // or bootstrap change replaces the service with the new image.
266
+ if (isBundledService(news)) {
267
+ const hash = yield* serviceImage.hash({
268
+ source: news,
269
+ isExternal: news.isExternal,
270
+ });
271
+ if (hash !== output?.code?.hash) {
272
+ return { action: "replace", deleteFirst: true };
273
+ }
274
+ }
275
+ return { action: "noop" };
276
+ }),
277
+ reconcile: Effect.fn(function* ({ id, instanceId, news, olds, output, session }) {
278
+ const desired = yield* normalizeDesired(id, news, instanceId);
279
+ const resolved = yield* resolveImage(id, news, desired.name, desired.context, session);
280
+ const image = resolved.imageRef;
281
+ const code = resolved.codeHash ? { hash: resolved.codeHash } : undefined;
282
+ const environment = isBundledService(news)
283
+ ? { ...alchemyEnv, ...desired.environment }
284
+ : desired.environment;
285
+ if (output && olds) {
286
+ const oldDesired = yield* normalizeDesired(id, olds, instanceId);
287
+ if (deepEqual(oldDesired, desired) &&
288
+ (resolved.codeHash === undefined || resolved.codeHash === output.code?.hash)) {
289
+ const current = yield* inspect(output.id, desired.context);
290
+ if (current) {
291
+ ensureReplicatedMode(current);
292
+ return toServiceAttributes(current, desired.context, code);
293
+ }
294
+ }
295
+ }
296
+ if (output) {
297
+ const current = yield* inspect(output.id, desired.context);
298
+ if (current) {
299
+ ensureReplicatedMode(current);
300
+ const internalTags = yield* createInternalTags(id);
301
+ const allDesiredLabels = { ...internalTags, ...desired.labels };
302
+ const currentLabels = current.Spec.Labels ?? {};
303
+ const labelsToRemove = Object.keys(currentLabels).filter((k) => !(k in allDesiredLabels));
304
+ yield* docker.service.update({
305
+ context: desired.context,
306
+ id: output.id,
307
+ image,
308
+ replicas: desired.replicas,
309
+ "endpoint-mode": desired.endpointMode,
310
+ "constraint-add": desired.constraints,
311
+ "replicas-max-per-node": desired.maxReplicasPerNode,
312
+ "placement-pref": desired.preferences,
313
+ "update-parallelism": desired.updateConfig?.parallelism,
314
+ "update-delay": desired.updateConfig?.delay,
315
+ "update-monitor": desired.updateConfig?.monitor,
316
+ "update-failure-action": desired.updateConfig?.failureAction,
317
+ "update-max-failure-ratio": desired.updateConfig?.maxFailureRatio,
318
+ "update-order": desired.updateConfig?.order,
319
+ "rollback-parallelism": desired.rollbackConfig?.parallelism,
320
+ "rollback-delay": desired.rollbackConfig?.delay,
321
+ "rollback-monitor": desired.rollbackConfig?.monitor,
322
+ "rollback-failure-action": desired.rollbackConfig?.failureAction,
323
+ "rollback-max-failure-ratio": desired.rollbackConfig?.maxFailureRatio,
324
+ "rollback-order": desired.rollbackConfig?.order,
325
+ "restart-condition": desired.restartPolicy?.condition,
326
+ "restart-delay": desired.restartPolicy?.delay,
327
+ "restart-max-attempts": desired.restartPolicy?.maxAttempts,
328
+ "restart-window": desired.restartPolicy?.window,
329
+ "health-cmd": desired.healthcheck
330
+ ? healthcheckCommand(desired.healthcheck.cmd)
331
+ : undefined,
332
+ "no-healthcheck": desired.healthcheck !== undefined &&
333
+ isHealthcheckDisabled(desired.healthcheck.cmd),
334
+ "health-interval": desired.healthcheck?.interval,
335
+ "health-timeout": desired.healthcheck?.timeout,
336
+ "health-retries": desired.healthcheck?.retries,
337
+ "health-start-period": desired.healthcheck?.startPeriod,
338
+ "stop-grace-period": desired.stopGracePeriod,
339
+ "mount-add": desired.volumes.map(formatMount),
340
+ "secret-add": desired.secrets.map(formatRef),
341
+ "config-add": desired.configs.map(formatRef),
342
+ "read-only": desired.readOnlyRootFs || undefined,
343
+ "publish-add": desired.ports.map(formatPublish),
344
+ "label-add": allDesiredLabels,
345
+ "label-rm": labelsToRemove,
346
+ "env-add": environment,
347
+ args: desired.command.length > 0
348
+ ? desired.command.concat(desired.args).join(" ")
349
+ : undefined,
350
+ });
351
+ return toServiceAttributes(yield* inspectOrDie(inspect, output.id, desired.context), desired.context, code);
352
+ }
353
+ }
354
+ const existingByName = yield* inspect(desired.name, desired.context);
355
+ if (existingByName) {
356
+ ensureReplicatedMode(existingByName);
357
+ return toServiceAttributes(existingByName, desired.context, code);
358
+ }
359
+ const internalTags = yield* createInternalTags(id);
360
+ const allDesiredLabels = { ...internalTags, ...desired.labels };
361
+ yield* docker.service.create({
362
+ context: desired.context,
363
+ name: desired.name,
364
+ image,
365
+ replicas: desired.replicas,
366
+ "endpoint-mode": desired.endpointMode,
367
+ network: desired.networks.map((n) => [`name=${n.name}`, ...(n.aliases ?? []).map((a) => `alias=${a}`)].join(",")),
368
+ constraint: desired.constraints,
369
+ "replicas-max-per-node": desired.maxReplicasPerNode,
370
+ "placement-pref": desired.preferences,
371
+ "update-parallelism": desired.updateConfig?.parallelism,
372
+ "update-delay": desired.updateConfig?.delay,
373
+ "update-monitor": desired.updateConfig?.monitor,
374
+ "update-failure-action": desired.updateConfig?.failureAction,
375
+ "update-max-failure-ratio": desired.updateConfig?.maxFailureRatio,
376
+ "update-order": desired.updateConfig?.order,
377
+ "rollback-parallelism": desired.rollbackConfig?.parallelism,
378
+ "rollback-delay": desired.rollbackConfig?.delay,
379
+ "rollback-monitor": desired.rollbackConfig?.monitor,
380
+ "rollback-failure-action": desired.rollbackConfig?.failureAction,
381
+ "rollback-max-failure-ratio": desired.rollbackConfig?.maxFailureRatio,
382
+ "rollback-order": desired.rollbackConfig?.order,
383
+ "restart-condition": desired.restartPolicy?.condition,
384
+ "restart-delay": desired.restartPolicy?.delay,
385
+ "restart-max-attempts": desired.restartPolicy?.maxAttempts,
386
+ "restart-window": desired.restartPolicy?.window,
387
+ "health-cmd": desired.healthcheck
388
+ ? healthcheckCommand(desired.healthcheck.cmd)
389
+ : undefined,
390
+ "no-healthcheck": desired.healthcheck !== undefined && isHealthcheckDisabled(desired.healthcheck.cmd),
391
+ "health-interval": desired.healthcheck?.interval,
392
+ "health-timeout": desired.healthcheck?.timeout,
393
+ "health-retries": desired.healthcheck?.retries,
394
+ "health-start-period": desired.healthcheck?.startPeriod,
395
+ "stop-grace-period": desired.stopGracePeriod,
396
+ mount: desired.volumes.map(formatMount),
397
+ secret: desired.secrets.map(formatRef),
398
+ config: desired.configs.map(formatRef),
399
+ "read-only": desired.readOnlyRootFs || undefined,
400
+ publish: desired.ports.map(formatPublish),
401
+ label: allDesiredLabels,
402
+ env: environment,
403
+ command: desired.command,
404
+ args: desired.args,
405
+ });
406
+ return toServiceAttributes(yield* inspectOrDie(inspect, desired.name, desired.context), desired.context, code);
407
+ }),
408
+ delete: Effect.fn(({ output }) => docker
409
+ .run([
410
+ ...(output.context ? ["--context", output.context] : []),
411
+ "service",
412
+ "scale",
413
+ "--detach=false",
414
+ `${output.id}=0`,
415
+ ])
416
+ .pipe(Effect.flatMap(() => docker.service.remove(output.id, output.context)), Effect.flatMap(() => waitForServiceContainersReleased(docker, output.id, output.context)), Effect.catchReason("PlatformError", "NotFound", () => Effect.void),
417
+ // Best-effort: drop the content-addressed image built for a
418
+ // bundled program so replaced/destroyed services don't strand
419
+ // local image tags.
420
+ Effect.andThen(output.code
421
+ ? docker.image
422
+ .remove(output.image, true, output.context)
423
+ .pipe(Effect.catchCause(() => Effect.void))
424
+ : Effect.void))),
425
+ });
426
+ }));
427
+ /** Swarm rejects service names longer than 63 characters. */
428
+ const servicePhysicalName = (id, props, instanceId) => dockerPhysicalName(id, props, instanceId, 63);
429
+ const normalizeDesired = (id, props, instanceId) => servicePhysicalName(id, props, instanceId).pipe(Effect.map((name) => ({
430
+ name,
431
+ context: dockerEngineContextName(props.context),
432
+ // The bundled form's image identity is its content hash (compared
433
+ // separately in diff) — the `image` prop is only the environment base
434
+ // there, and it participates in the hash.
435
+ image: isBundledService(props) ? undefined : normalizeImageRef(props.image),
436
+ command: props.command ?? [],
437
+ args: props.args ?? [],
438
+ environment: {
439
+ ...normalizeEnvironment(props.environment),
440
+ ...normalizeBoundEnv(props.env),
441
+ },
442
+ networks: normalizeNetworks(props.networks),
443
+ ports: normalizePorts(props.ports),
444
+ endpointMode: props.endpointMode ?? "vip",
445
+ replicas: normalizeReplicas(props.replicas),
446
+ constraints: [...(props.constraints ?? []), ...(props.placement?.constraints ?? [])],
447
+ maxReplicasPerNode: props.placement?.maxReplicasPerNode,
448
+ preferences: props.placement?.preferences ?? [],
449
+ updateConfig: props.updateConfig,
450
+ rollbackConfig: props.rollbackConfig,
451
+ restartPolicy: props.restartPolicy,
452
+ healthcheck: props.healthcheck,
453
+ stopGracePeriod: props.stopGracePeriod,
454
+ volumes: props.volumes ?? [],
455
+ secrets: props.secrets ?? [],
456
+ configs: props.configs ?? [],
457
+ readOnlyRootFs: props.readOnlyRootFs ?? false,
458
+ labels: props.labels ?? {},
459
+ })));
460
+ const normalizeImageRef = (image) => typeof image === "string" ? image : image.imageRef;
461
+ const normalizeEnvironment = (environment) => Object.fromEntries(Object.entries(environment ?? {}).map(([key, value]) => [
462
+ key,
463
+ Redacted.isRedacted(value) ? Redacted.value(value) : value,
464
+ ]));
465
+ /**
466
+ * Platform-injected env (`props.env`) after Output resolution: values are
467
+ * usually marker-packed strings, but tolerate Redacted and structured values.
468
+ */
469
+ const normalizeBoundEnv = (env) => Object.fromEntries(Object.entries(env ?? {}).map(([key, value]) => [
470
+ key,
471
+ typeof value === "string"
472
+ ? value
473
+ : Redacted.isRedacted(value)
474
+ ? Redacted.value(value)
475
+ : JSON.stringify(value),
476
+ ]));
477
+ const normalizePorts = (ports) => (ports ?? []).map((port) => ({
478
+ external: port.external,
479
+ internal: port.internal,
480
+ protocol: port.protocol ?? "tcp",
481
+ mode: port.mode ?? "ingress",
482
+ }));
483
+ const normalizeReplicas = (replicas) => {
484
+ const value = replicas ?? 1;
485
+ if (!Number.isInteger(value) || value < 0) {
486
+ throw new Error("Service.replicas must be an integer >= 0");
487
+ }
488
+ return value;
489
+ };
490
+ const normalizeNetworks = (networks) => (networks ?? []).map((network) => typeof network === "string"
491
+ ? { name: network }
492
+ : { name: network.name, aliases: network.aliases });
493
+ const formatMount = (volume) => [
494
+ `type=${/^(\/|\.\/|\.\.\/|~)/.test(volume.hostPath) ? "bind" : "volume"}`,
495
+ `source=${volume.hostPath}`,
496
+ `target=${volume.containerPath}`,
497
+ ...(volume.readOnly ? ["readonly=true"] : []),
498
+ ].join(",");
499
+ const formatRef = (ref) => Object.entries(ref)
500
+ .filter(([, value]) => value !== undefined)
501
+ .map(([key, value]) => `${key}=${value}`)
502
+ .join(",");
503
+ const formatPublish = (port) => [
504
+ ...(port.external !== undefined ? [`published=${port.external}`] : []),
505
+ `target=${port.internal}`,
506
+ `protocol=${port.protocol ?? "tcp"}`,
507
+ `mode=${port.mode ?? "ingress"}`,
508
+ ].join(",");
509
+ const toServiceAttributes = (service, context, code) => ({
510
+ id: service.ID,
511
+ name: service.Spec.Name,
512
+ context,
513
+ image: service.Spec.TaskTemplate?.ContainerSpec?.Image ?? "",
514
+ replicas: service.Spec.Mode?.Replicated?.Replicas ?? 1,
515
+ networks: (service.Spec.TaskTemplate?.Networks ?? []).flatMap((n) => n.Target ? [n.Target] : []),
516
+ ports: (service.Spec.EndpointSpec?.Ports ?? []).flatMap((port) => {
517
+ if (port.PublishedPort === undefined || port.TargetPort === undefined) {
518
+ return [];
519
+ }
520
+ return [
521
+ {
522
+ external: port.PublishedPort,
523
+ internal: port.TargetPort,
524
+ protocol: port.Protocol ?? "tcp",
525
+ mode: port.PublishMode ?? "ingress",
526
+ },
527
+ ];
528
+ }),
529
+ labels: service.Spec.Labels ?? {},
530
+ endpointMode: service.Spec.EndpointSpec?.Mode ?? "vip",
531
+ createdAt: Date.parse(service.CreatedAt ?? "") || Date.now(),
532
+ updatedAt: Date.parse(service.UpdatedAt ?? "") || Date.now(),
533
+ code,
534
+ });
535
+ const ensureReplicatedMode = (service) => {
536
+ if (service.Spec.Mode?.Global !== undefined) {
537
+ throw new Error(`Docker.Service only supports replicated services. Service "${service.Spec.Name}" is global.`);
538
+ }
539
+ };
540
+ const parseInspectArray = (json) => {
541
+ const parsed = JSON.parse(json);
542
+ if (parsed.length === 0) {
543
+ throw new Error("docker inspect returned no objects");
544
+ }
545
+ return parsed[0];
546
+ };
547
+ const normalizeServiceInspect = (value) => {
548
+ if (typeof value === "object" && value !== null && "stdout" in value) {
549
+ const stdout = value.stdout;
550
+ if (typeof stdout === "string") {
551
+ return parseInspectArray(stdout);
552
+ }
553
+ }
554
+ return value;
555
+ };
556
+ const inspectOrDie = (inspect, nameOrId, context) => inspect(nameOrId, context).pipe(Effect.flatMap((value) => value ? Effect.succeed(value) : Effect.die(`Expected ${nameOrId} to exist after create`)));
557
+ const waitForServiceContainersReleased = (docker, serviceId, context) => {
558
+ const maxAttempts = 10;
559
+ const noContainers = Symbol.for("Docker.Service.NoContainers");
560
+ const poll = listServiceContainerIds(docker, serviceId, context).pipe(Effect.flatMap((containerIds) => containerIds.length === 0 ? Effect.fail(noContainers) : Effect.succeed(containerIds)));
561
+ return poll.pipe(Effect.repeat(Schedule.spaced("1 second").pipe(Schedule.upTo({ times: maxAttempts - 1 }))), Effect.catchIf((error) => error === noContainers, () => Effect.void), Effect.andThen(listServiceContainerIds(docker, serviceId, context)), Effect.flatMap((containerIds) => containerIds.length === 0
562
+ ? Effect.void
563
+ : // Best effort cleanup for lingering task containers that keep volumes attached.
564
+ Effect.forEach(containerIds, (containerId) => docker
565
+ .run([
566
+ ...(context ? ["--context", context] : []),
567
+ "container",
568
+ "rm",
569
+ "-f",
570
+ containerId,
571
+ ])
572
+ .pipe(Effect.catchCause(() => Effect.void)), { concurrency: "unbounded" }).pipe(Effect.as(undefined))));
573
+ };
574
+ const listServiceContainerIds = (docker, serviceId, context) => docker
575
+ .run([
576
+ ...(context ? ["--context", context] : []),
577
+ "ps",
578
+ "-a",
579
+ "--filter",
580
+ `label=com.docker.swarm.service.id=${serviceId}`,
581
+ "--format",
582
+ "{{.ID}}",
583
+ ])
584
+ .pipe(Effect.map((result) => result.stdout
585
+ .split("\n")
586
+ .map((line) => line.trim())
587
+ .filter((line) => line.length > 0)));
588
+ //# sourceMappingURL=Service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Service.js","sourceRoot":"","sources":["../src/Service.ts"],"names":[],"mappings":"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"}