9385a6346a
Signed-off-by: Helder Correia <174525+helderco@users.noreply.github.com>
191 lines
3.5 KiB
CUE
191 lines
3.5 KiB
CUE
package dagger
|
|
|
|
import (
|
|
"list"
|
|
)
|
|
|
|
// Upload a container image to a remote repository
|
|
#Push: {
|
|
$dagger: task: _name: "Push"
|
|
|
|
// Target repository address
|
|
dest: #Ref
|
|
|
|
// Filesystem contents to push
|
|
input: #FS
|
|
|
|
// Container image config
|
|
config: #ImageConfig
|
|
|
|
// Authentication
|
|
auth?: {
|
|
username: string
|
|
secret: #Secret
|
|
}
|
|
|
|
// Complete ref of the pushed image, including digest
|
|
result: #Ref
|
|
}
|
|
|
|
// A ref is an address for a remote container image
|
|
//
|
|
// Examples:
|
|
// - "index.docker.io/dagger"
|
|
// - "dagger"
|
|
// - "index.docker.io/dagger:latest"
|
|
// - "index.docker.io/dagger:latest@sha256:a89cb097693dd354de598d279c304a1c73ee550fbfff6d9ee515568e0c749cfe"
|
|
#Ref: string
|
|
|
|
// Container image config. See [OCI](https://www.opencontainers.org/).
|
|
#ImageConfig: {
|
|
user?: string
|
|
expose?: [string]: {}
|
|
env?: [string]: string
|
|
entrypoint?: [...string]
|
|
cmd?: [...string]
|
|
volume?: [string]: {}
|
|
workdir?: string
|
|
label?: [string]: string
|
|
stopsignal?: string
|
|
healthcheck?: #HealthCheck
|
|
argsescaped?: bool
|
|
onbuild?: [...string]
|
|
stoptimeout?: int
|
|
shell?: [...string]
|
|
}
|
|
|
|
#HealthCheck: {
|
|
test?: [...string]
|
|
interval?: int
|
|
timeout?: int
|
|
startperiod?: int
|
|
retries?: int
|
|
}
|
|
|
|
// Download a container image from a remote repository
|
|
#Pull: {
|
|
$dagger: task: _name: "Pull"
|
|
|
|
// Repository source ref
|
|
source: #Ref
|
|
|
|
// Authentication
|
|
auth?: {
|
|
username: string
|
|
secret: #Secret
|
|
}
|
|
|
|
// Root filesystem of downloaded image
|
|
output: #FS
|
|
|
|
// Image digest
|
|
digest: string
|
|
|
|
// Downloaded container image config
|
|
config: #ImageConfig
|
|
}
|
|
|
|
// Build a container image using a Dockerfile
|
|
#Dockerfile: {
|
|
$dagger: task: _name: "Dockerfile"
|
|
|
|
// Source directory to build
|
|
source: #FS
|
|
|
|
dockerfile: *{
|
|
path: string | *"Dockerfile"
|
|
} | {
|
|
contents: string
|
|
}
|
|
|
|
// Authentication
|
|
auth: [registry=string]: {
|
|
username: string
|
|
secret: #Secret
|
|
}
|
|
|
|
platforms?: [...string]
|
|
target?: string
|
|
buildArg?: [string]: string
|
|
label?: [string]: string
|
|
hosts?: [string]: string
|
|
|
|
// Root filesystem produced
|
|
output: #FS
|
|
|
|
// Container image config produced
|
|
config: #ImageConfig
|
|
}
|
|
|
|
// Change image config
|
|
#Set: {
|
|
// The source image config
|
|
input: #ImageConfig
|
|
|
|
// The config to merge
|
|
config: #ImageConfig
|
|
|
|
// Resulting config
|
|
output: #ImageConfig & {
|
|
let structs = ["env", "label", "volume", "expose"]
|
|
let lists = ["onbuild"]
|
|
|
|
// doesn't exist in config, copy away
|
|
for field, value in input if config[field] == _|_ {
|
|
"\(field)": value
|
|
}
|
|
|
|
// only exists in config, just copy as is
|
|
for field, value in config if input[field] == _|_ {
|
|
"\(field)": value
|
|
}
|
|
|
|
// these should exist in both places
|
|
for field, value in config if input[field] != _|_ {
|
|
"\(field)": {
|
|
// handle structs that need merging
|
|
if list.Contains(structs, field) {
|
|
_#mergeStructs & {
|
|
#a: input[field]
|
|
#b: config[field]
|
|
}
|
|
}
|
|
|
|
// handle lists that need concatenation
|
|
if list.Contains(lists, field) {
|
|
list.Concat([
|
|
input[field],
|
|
config[field],
|
|
])
|
|
}
|
|
|
|
// replace anything else
|
|
if !list.Contains(structs+lists, field) {
|
|
value
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Merge two structs by overwriting or adding values
|
|
_#mergeStructs: {
|
|
// Struct with defaults
|
|
#a: [string]: _
|
|
|
|
// Struct with overrides
|
|
#b: [string]: _
|
|
{
|
|
// FIXME: we need exists() in if because this matches any kind of error (cue-lang/cue#943)
|
|
// add anything not in b
|
|
for field, value in #a if #b[field] == _|_ {
|
|
"\(field)": value
|
|
}
|
|
|
|
// safely add all of b
|
|
for field, value in #b {
|
|
"\(field)": value
|
|
}
|
|
}
|
|
}
|