Support loading artifacts into a Docker Engine
This adds support to loading artifacts (e.g. docker.#Build, os.#Container, ...) into any arbitrary docker engine (through a dagger.#Stream for UNIX sockets or SSH for a remote engine) Implementation: - Add op.#SaveImage which serializes an artifact into an arbitrary path (docker tarball format) - Add docker.#Load which uses op.#SaveImage to serialize to disk and executes `docker load` to load it back Caveats: Because we're doing this in userspace rather than letting dagger itself load the image, the performance is pretty bad. The buildkit API is meant for streaming (get a stream of a docker image pipe it into docker load). Because of userspace, we have to load the entire docker image into memory, then serialize it in a single WriteFile LLB operation. Example: ```cue package main import ( "alpha.dagger.io/dagger" "alpha.dagger.io/docker" ) source: dagger.#Input & dagger.#Artifact dockersocket: dagger.#Input & dagger.#Stream build: docker.#Build & { "source": source } load: docker.#Load & { source: build tag: "testimage" socket: dockersocket } ``` Signed-off-by: Andrea Luzzardi <aluzzardi@gmail.com>
This commit is contained in:
@@ -101,6 +101,87 @@ import (
|
||||
} & dagger.#Output
|
||||
}
|
||||
|
||||
// Load a docker image into a docker engine
|
||||
#Load: {
|
||||
// Connect to a remote SSH server
|
||||
ssh?: {
|
||||
// ssh host
|
||||
host: dagger.#Input & {string}
|
||||
|
||||
// ssh user
|
||||
user: dagger.#Input & {string}
|
||||
|
||||
// ssh port
|
||||
port: dagger.#Input & {*22 | int}
|
||||
|
||||
// private key
|
||||
key: dagger.#Input & {dagger.#Secret}
|
||||
|
||||
// fingerprint
|
||||
fingerprint?: dagger.#Input & {string}
|
||||
|
||||
// ssh key passphrase
|
||||
keyPassphrase?: dagger.#Input & {dagger.#Secret}
|
||||
}
|
||||
|
||||
// Mount local docker socket
|
||||
socket?: dagger.#Stream & dagger.#Input
|
||||
|
||||
// Name and optionally a tag in the 'name:tag' format
|
||||
tag: dagger.#Input & {string}
|
||||
|
||||
// Image source
|
||||
source: dagger.#Input & {dagger.#Artifact}
|
||||
|
||||
save: #up: [
|
||||
op.#Load & {from: source},
|
||||
|
||||
op.#SaveImage & {
|
||||
"tag": tag
|
||||
dest: "/image.tar"
|
||||
},
|
||||
]
|
||||
|
||||
load: #Command & {
|
||||
if ssh != _|_ {
|
||||
"ssh": ssh
|
||||
}
|
||||
if socket != _|_ {
|
||||
"socket": socket
|
||||
}
|
||||
|
||||
copy: "/src": from: save
|
||||
|
||||
command: "docker load -i /src/image.tar"
|
||||
}
|
||||
|
||||
// Image ref
|
||||
ref: {
|
||||
string
|
||||
|
||||
#up: [
|
||||
op.#Load & {from: save},
|
||||
|
||||
op.#Export & {
|
||||
source: "/dagger/image_ref"
|
||||
},
|
||||
]
|
||||
} & dagger.#Output
|
||||
|
||||
// Image digest
|
||||
digest: {
|
||||
string
|
||||
|
||||
#up: [
|
||||
op.#Load & {from: save},
|
||||
|
||||
op.#Export & {
|
||||
source: "/dagger/image_digest"
|
||||
},
|
||||
]
|
||||
} & dagger.#Output
|
||||
}
|
||||
|
||||
#Run: {
|
||||
// Connect to a remote SSH server
|
||||
ssh?: {
|
||||
|
Reference in New Issue
Block a user