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

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 +56 -0
  8. package/lib/BuildHash.d.ts.map +1 -0
  9. package/lib/BuildHash.js +172 -0
  10. package/lib/BuildHash.js.map +1 -0
  11. package/lib/Container.d.ts +450 -0
  12. package/lib/Container.d.ts.map +1 -0
  13. package/lib/Container.js +745 -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 +527 -0
  20. package/lib/Docker.d.ts.map +1 -0
  21. package/lib/Docker.js +437 -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 +179 -0
  32. package/lib/Image.d.ts.map +1 -0
  33. package/lib/Image.js +210 -0
  34. package/lib/Image.js.map +1 -0
  35. package/lib/ImageSource.d.ts +288 -0
  36. package/lib/ImageSource.d.ts.map +1 -0
  37. package/lib/ImageSource.js +498 -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 +499 -0
  60. package/lib/Service.d.ts.map +1 -0
  61. package/lib/Service.js +730 -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 +265 -0
  82. package/src/Container.ts +1118 -0
  83. package/src/Context.ts +215 -0
  84. package/src/Docker.ts +1173 -0
  85. package/src/Dockerfile.ts +81 -0
  86. package/src/HealthcheckCommand.ts +35 -0
  87. package/src/Image.ts +322 -0
  88. package/src/ImageSource.ts +842 -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 +1264 -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/Image.d.ts ADDED
@@ -0,0 +1,179 @@
1
+ import * as Provider from "alchemy/Provider";
2
+ import { Resource } from "alchemy/Resource";
3
+ import * as FileSystem from "effect/FileSystem";
4
+ import * as Path from "effect/Path";
5
+ import type * as Redacted from "effect/Redacted";
6
+ import { Docker } from "./Docker.ts";
7
+ import type { Providers } from "./Providers.ts";
8
+ import { type ImageRegistry } from "./Registry.ts";
9
+ export interface DockerBuildOptions {
10
+ /**
11
+ * Build context directory.
12
+ *
13
+ * @default Current working directory.
14
+ */
15
+ context?: string;
16
+ /**
17
+ * Dockerfile path, relative to the context unless absolute.
18
+ *
19
+ * @default "Dockerfile"
20
+ */
21
+ dockerfile?: string;
22
+ /** Target platform, e.g. `"linux/amd64"`. */
23
+ platform?: string;
24
+ /**
25
+ * Docker build arguments (`--build-arg`). Never pass secrets here: build
26
+ * args are visible in the image history. Use {@link secrets} instead.
27
+ */
28
+ args?: Record<string, string>;
29
+ /**
30
+ * BuildKit secrets, keyed by id. Mount one in a `RUN` step with
31
+ * `--mount=type=secret,id=<id>` and read it from `/run/secrets/<id>`, or
32
+ * add `env=<NAME>` to expose it as an environment variable for that step.
33
+ * A secret never enters the image, its build history, or `docker`'s argv.
34
+ */
35
+ secrets?: Record<string, Redacted.Redacted<string>>;
36
+ /** Multi-stage build target. */
37
+ target?: string;
38
+ /** Cache sources passed as `--cache-from`. */
39
+ cacheFrom?: string[];
40
+ /** Cache destinations passed as `--cache-to`. */
41
+ cacheTo?: string[];
42
+ /** Additional Docker build options. */
43
+ options?: string[];
44
+ }
45
+ export interface ImageProps {
46
+ /**
47
+ * Repository/name for the built image.
48
+ *
49
+ * @default Generated from stack, stage, logical id, and instance id.
50
+ */
51
+ name?: string;
52
+ /** Image tag. @default "latest" */
53
+ tag?: string;
54
+ /**
55
+ * Registry credentials. The image is pushed to this registry (unless
56
+ * `skipPush`), and the build itself authenticates with them, so private
57
+ * base images and `type=registry` caches hosted there resolve without a
58
+ * host `docker login`. Credentials already in `DOCKER_AUTH_CONFIG` for
59
+ * other registries are kept. Build-time authentication needs Buildx 0.26+
60
+ * (Docker Desktop 4.44+) or the legacy builder; older Buildx plugins ignore
61
+ * it, so a private base image there still needs `docker login`.
62
+ */
63
+ registry?: ImageRegistry;
64
+ /** Skip registry push even when `registry` is set. @default false */
65
+ skipPush?: boolean;
66
+ /** Docker context name or context resource. */
67
+ context?: Docker.ContextRef;
68
+ /** Docker build configuration. */
69
+ build: DockerBuildOptions;
70
+ }
71
+ export interface Image extends Resource<"Docker.Image", ImageProps, {
72
+ /** Image repository/name without tag. */
73
+ name: string;
74
+ /** Final image reference. Includes registry host when pushed there. */
75
+ imageRef: string;
76
+ /** Local image id after build/tag. */
77
+ imageId: string;
78
+ /** Registry digest after push when available. */
79
+ repoDigest?: string;
80
+ /** Tag used for the local image. */
81
+ tag: string;
82
+ /** Build timestamp in milliseconds since epoch. */
83
+ builtAt: number;
84
+ }, never, Providers> {
85
+ }
86
+ /**
87
+ * Builds, tags, and optionally pushes Docker images through the active Docker
88
+ * context.
89
+ *
90
+ * This resource uses the Docker CLI and whatever daemon or remote context the
91
+ * CLI is configured to target. It is separate from `Cloudflare.Container`;
92
+ * registry image references are the boundary between Docker-managed images and
93
+ * cloud container platforms.
94
+ *
95
+ * `Image` always builds from a Dockerfile. To pull (and optionally re-tag and
96
+ * push) an existing registry image, use `Docker.RemoteImage`.
97
+ *
98
+ *
99
+ * ### Building Images
100
+ * **Example:** Build from a Dockerfile
101
+ * ```typescript
102
+ * const image = yield* Docker.Image("app", {
103
+ * name: "my-app",
104
+ * tag: "latest",
105
+ * build: {
106
+ * context: "./app",
107
+ * dockerfile: "Dockerfile",
108
+ * args: { NODE_ENV: "production" },
109
+ * },
110
+ * });
111
+ * ```
112
+ *
113
+ * ### Build Secrets
114
+ * **Example:** Install from a private npm registry
115
+ * ```typescript
116
+ * // Dockerfile:
117
+ * // RUN --mount=type=secret,id=NPM_TOKEN,env=NPM_TOKEN npm ci
118
+ * const image = yield* Docker.Image("app", {
119
+ * name: "my-app",
120
+ * build: {
121
+ * context: "./app",
122
+ * secrets: { NPM_TOKEN: Config.Redacted("NPM_TOKEN") },
123
+ * },
124
+ * });
125
+ * ```
126
+ *
127
+ * The secret is mounted only into the `RUN` step that asks for it; it never
128
+ * lands in an image layer or the build history.
129
+ *
130
+ * ### Registry Push
131
+ * **Example:** Push with Redacted credentials
132
+ * ```typescript
133
+ * const image = yield* Docker.Image("app", {
134
+ * name: "my-app",
135
+ * build: { context: "./app" },
136
+ * registry: {
137
+ * server: "ghcr.io",
138
+ * username: "octocat",
139
+ * password: Config.Redacted("GITHUB_TOKEN"),
140
+ * },
141
+ * });
142
+ * ```
143
+ *
144
+ * ### Private Base Images and Registry Caches
145
+ * **Example:** Build FROM a private base image with a registry cache
146
+ * ```typescript
147
+ * // Dockerfile: FROM registry.example.com/base:v1
148
+ * const image = yield* Docker.Image("app", {
149
+ * name: "registry.example.com/app",
150
+ * build: {
151
+ * context: "./app",
152
+ * cacheFrom: ["type=registry,ref=registry.example.com/app:buildcache"],
153
+ * cacheTo: ["type=registry,ref=registry.example.com/app:buildcache,mode=max"],
154
+ * },
155
+ * // Authenticates the base-image pull and cache import/export, then the push.
156
+ * registry: {
157
+ * server: "registry.example.com",
158
+ * username: "deploy",
159
+ * password: Config.Redacted("REGISTRY_PASSWORD"),
160
+ * },
161
+ * });
162
+ * ```
163
+ *
164
+ * ### Docker Context
165
+ * **Example:** Build in a named Docker context
166
+ * ```typescript
167
+ * const image = yield* Docker.Image("app", {
168
+ * name: "my-app",
169
+ * context: "remote-build",
170
+ * build: { context: "./app" },
171
+ * });
172
+ * ```
173
+ *
174
+ * @resource
175
+ * @product Image
176
+ */
177
+ export declare const Image: import("alchemy/Resource").ResourceClass<Image>;
178
+ export declare const ImageProvider: () => import("effect/Layer").Layer<Provider.Provider<Image>, never, Docker | FileSystem.FileSystem | Path.Path | import("alchemy/Stack").Stack | import("alchemy/Stage").Stage>;
179
+ //# sourceMappingURL=Image.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Image.d.ts","sourceRoot":"","sources":["../src/Image.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,IAAI,MAAM,aAAa,CAAC;AACpC,OAAO,KAAK,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAyC,MAAM,aAAa,CAAC;AAC5E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EACL,KAAK,aAAa,EAKnB,MAAM,eAAe,CAAC;AAEvB,MAAM,WAAW,kBAAkB;IACjC;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IACpD,gCAAgC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,qEAAqE;IACrE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IAC5B,kCAAkC;IAClC,KAAK,EAAE,kBAAkB,CAAC;CAC3B;AAED,MAAM,WAAW,KAAM,SAAQ,QAAQ,CACrC,cAAc,EACd,UAAU,EACV;IACE,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,QAAQ,EAAE,MAAM,CAAC;IACjB,sCAAsC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,iDAAiD;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oCAAoC;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,mDAAmD;IACnD,OAAO,EAAE,MAAM,CAAC;CACjB,EACD,KAAK,EACL,SAAS,CACV;CAAG;AAEJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0FG;AACH,eAAO,MAAM,KAAK,iDAAkC,CAAC;AAErD,eAAO,MAAM,aAAa,iLA6HvB,CAAC"}
package/lib/Image.js ADDED
@@ -0,0 +1,210 @@
1
+ import * as Artifacts from "alchemy/Artifacts";
2
+ import { isResolved } from "alchemy/Diff";
3
+ import * as Provider from "alchemy/Provider";
4
+ import { Resource } from "alchemy/Resource";
5
+ import * as Effect from "effect/Effect";
6
+ import * as FileSystem from "effect/FileSystem";
7
+ import * as Path from "effect/Path";
8
+ import { Docker, dockerContextName, dockerPhysicalName } from "./Docker.js";
9
+ import { parseCreatedAt, publishedRepoDigest, repositoryFromImageRef, withRegistryHost, } from "./Registry.js";
10
+ /**
11
+ * Builds, tags, and optionally pushes Docker images through the active Docker
12
+ * context.
13
+ *
14
+ * This resource uses the Docker CLI and whatever daemon or remote context the
15
+ * CLI is configured to target. It is separate from `Cloudflare.Container`;
16
+ * registry image references are the boundary between Docker-managed images and
17
+ * cloud container platforms.
18
+ *
19
+ * `Image` always builds from a Dockerfile. To pull (and optionally re-tag and
20
+ * push) an existing registry image, use `Docker.RemoteImage`.
21
+ *
22
+ *
23
+ * ### Building Images
24
+ * **Example:** Build from a Dockerfile
25
+ * ```typescript
26
+ * const image = yield* Docker.Image("app", {
27
+ * name: "my-app",
28
+ * tag: "latest",
29
+ * build: {
30
+ * context: "./app",
31
+ * dockerfile: "Dockerfile",
32
+ * args: { NODE_ENV: "production" },
33
+ * },
34
+ * });
35
+ * ```
36
+ *
37
+ * ### Build Secrets
38
+ * **Example:** Install from a private npm registry
39
+ * ```typescript
40
+ * // Dockerfile:
41
+ * // RUN --mount=type=secret,id=NPM_TOKEN,env=NPM_TOKEN npm ci
42
+ * const image = yield* Docker.Image("app", {
43
+ * name: "my-app",
44
+ * build: {
45
+ * context: "./app",
46
+ * secrets: { NPM_TOKEN: Config.Redacted("NPM_TOKEN") },
47
+ * },
48
+ * });
49
+ * ```
50
+ *
51
+ * The secret is mounted only into the `RUN` step that asks for it; it never
52
+ * lands in an image layer or the build history.
53
+ *
54
+ * ### Registry Push
55
+ * **Example:** Push with Redacted credentials
56
+ * ```typescript
57
+ * const image = yield* Docker.Image("app", {
58
+ * name: "my-app",
59
+ * build: { context: "./app" },
60
+ * registry: {
61
+ * server: "ghcr.io",
62
+ * username: "octocat",
63
+ * password: Config.Redacted("GITHUB_TOKEN"),
64
+ * },
65
+ * });
66
+ * ```
67
+ *
68
+ * ### Private Base Images and Registry Caches
69
+ * **Example:** Build FROM a private base image with a registry cache
70
+ * ```typescript
71
+ * // Dockerfile: FROM registry.example.com/base:v1
72
+ * const image = yield* Docker.Image("app", {
73
+ * name: "registry.example.com/app",
74
+ * build: {
75
+ * context: "./app",
76
+ * cacheFrom: ["type=registry,ref=registry.example.com/app:buildcache"],
77
+ * cacheTo: ["type=registry,ref=registry.example.com/app:buildcache,mode=max"],
78
+ * },
79
+ * // Authenticates the base-image pull and cache import/export, then the push.
80
+ * registry: {
81
+ * server: "registry.example.com",
82
+ * username: "deploy",
83
+ * password: Config.Redacted("REGISTRY_PASSWORD"),
84
+ * },
85
+ * });
86
+ * ```
87
+ *
88
+ * ### Docker Context
89
+ * **Example:** Build in a named Docker context
90
+ * ```typescript
91
+ * const image = yield* Docker.Image("app", {
92
+ * name: "my-app",
93
+ * context: "remote-build",
94
+ * build: { context: "./app" },
95
+ * });
96
+ * ```
97
+ *
98
+ * @resource
99
+ * @product Image
100
+ */
101
+ export const Image = Resource("Docker.Image");
102
+ export const ImageProvider = () => Provider.effect(Image, Effect.gen(function* () {
103
+ const fs = yield* FileSystem.FileSystem;
104
+ const path = yield* Path.Path;
105
+ const docker = yield* Docker;
106
+ const buildAndInspectImage = Effect.fn(function* (id, props, instanceId) {
107
+ const name = yield* dockerPhysicalName(id, props, instanceId);
108
+ const engineContext = dockerContextName(props.context);
109
+ const tag = props.tag ?? "latest";
110
+ const ref = `${name}:${tag}`;
111
+ const paths = yield* resolveBuildPaths(props.build);
112
+ yield* docker.image.build({
113
+ tag: ref,
114
+ context: paths.context,
115
+ file: paths.dockerfile,
116
+ platform: props.build.platform,
117
+ target: props.build.target,
118
+ "build-arg": props.build.args,
119
+ secrets: props.build.secrets,
120
+ "cache-from": props.build.cacheFrom,
121
+ "cache-to": props.build.cacheTo,
122
+ args: props.build.options,
123
+ engineContext,
124
+ // Base images and registry caches may live in the same registry;
125
+ // the push itself stays in `reconcile`.
126
+ credentials: props.registry,
127
+ });
128
+ // Read the freshly built image's id and creation time straight from
129
+ // Docker rather than synthesizing a wall-clock timestamp.
130
+ return {
131
+ name,
132
+ tag,
133
+ image: yield* docker.image.inspect(ref, engineContext),
134
+ ref,
135
+ };
136
+ }, Artifacts.cached("build"));
137
+ const resolveBuildPaths = Effect.fn(function* (build) {
138
+ const cwd = yield* Effect.sync(() => process.cwd());
139
+ const context = path.resolve(build.context ?? cwd);
140
+ const dockerfile = build.dockerfile
141
+ ? path.isAbsolute(build.dockerfile)
142
+ ? build.dockerfile
143
+ : path.resolve(context, build.dockerfile)
144
+ : path.resolve(context, "Dockerfile");
145
+ if (!(yield* fs.exists(context))) {
146
+ return yield* Effect.die(`Docker build context does not exist: ${context}`);
147
+ }
148
+ if (!(yield* fs.exists(dockerfile))) {
149
+ return yield* Effect.die(`Dockerfile does not exist: ${dockerfile}`);
150
+ }
151
+ return { context, dockerfile };
152
+ });
153
+ return Image.Provider.of({
154
+ list: () => Effect.succeed([]),
155
+ read: Effect.fn(function* ({ id, instanceId, olds, output }) {
156
+ const context = dockerContextName(olds.context);
157
+ const ref = output?.imageRef ??
158
+ (yield* dockerPhysicalName(id, olds, instanceId).pipe(Effect.map((name) => `${name}:${olds.tag ?? "latest"}`)));
159
+ const image = yield* docker.image
160
+ .inspect(ref, context)
161
+ .pipe(Effect.catchReason("PlatformError", "NotFound", () => Effect.undefined));
162
+ if (!image)
163
+ return undefined;
164
+ return {
165
+ name: output?.name ?? repositoryFromImageRef(ref),
166
+ imageRef: ref,
167
+ imageId: image.Id,
168
+ repoDigest: output?.repoDigest,
169
+ tag: output?.tag ?? olds.tag ?? "latest",
170
+ builtAt: output?.builtAt ?? parseCreatedAt(image.Created),
171
+ };
172
+ }),
173
+ diff: Effect.fn(function* ({ id, instanceId, news, output, olds }) {
174
+ if (!isResolved(news) || !output)
175
+ return undefined;
176
+ if (dockerContextName(olds.context) !== dockerContextName(news.context)) {
177
+ return { action: "update" };
178
+ }
179
+ const { image } = yield* buildAndInspectImage(id, news, instanceId);
180
+ if (output?.imageId !== image.Id) {
181
+ return { action: "update" };
182
+ }
183
+ }),
184
+ reconcile: Effect.fn(function* ({ id, instanceId, news, session }) {
185
+ const context = dockerContextName(news.context);
186
+ const { name, tag, image, ref } = yield* buildAndInspectImage(id, news, instanceId);
187
+ let repoDigest;
188
+ let targetImageRef = ref;
189
+ if (news.registry && !news.skipPush) {
190
+ yield* session.note(`Pushing image to registry "${news.registry.server}"`);
191
+ targetImageRef = withRegistryHost(ref, news.registry);
192
+ const pushed = yield* docker.image.push(ref, news.registry, undefined, context);
193
+ const published = yield* docker.image.inspect(ref, context);
194
+ repoDigest = publishedRepoDigest(ref, pushed, published.RepoDigests, targetImageRef);
195
+ }
196
+ return {
197
+ name,
198
+ imageRef: targetImageRef,
199
+ imageId: image.Id,
200
+ repoDigest,
201
+ tag,
202
+ builtAt: parseCreatedAt(image.Created),
203
+ };
204
+ }),
205
+ delete: Effect.fn(({ olds, output }) => docker.image
206
+ .remove(output.imageRef, undefined, dockerContextName(olds.context))
207
+ .pipe(Effect.catchReason("PlatformError", "NotFound", () => Effect.void))),
208
+ });
209
+ }));
210
+ //# sourceMappingURL=Image.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Image.js","sourceRoot":"","sources":["../src/Image.ts"],"names":[],"mappings":"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"}