commit
676a895a0f
@ -1,5 +1,9 @@
|
|||||||
package engine
|
package engine
|
||||||
|
|
||||||
|
import (
|
||||||
|
"list"
|
||||||
|
)
|
||||||
|
|
||||||
// Upload a container image to a remote repository
|
// Upload a container image to a remote repository
|
||||||
#Push: {
|
#Push: {
|
||||||
$dagger: task: _name: "Push"
|
$dagger: task: _name: "Push"
|
||||||
@ -33,7 +37,6 @@ package engine
|
|||||||
#Ref: string
|
#Ref: string
|
||||||
|
|
||||||
// Container image config. See [OCI](https://www.opencontainers.org/).
|
// Container image config. See [OCI](https://www.opencontainers.org/).
|
||||||
// Spec left open on purpose to account for additional fields.
|
|
||||||
#ImageConfig: {
|
#ImageConfig: {
|
||||||
user?: string
|
user?: string
|
||||||
expose?: [string]: {}
|
expose?: [string]: {}
|
||||||
@ -113,3 +116,75 @@ package engine
|
|||||||
// Container image config produced
|
// Container image config produced
|
||||||
config: #ImageConfig
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
25
pkg/universe.dagger.io/docker/set.cue
Normal file
25
pkg/universe.dagger.io/docker/set.cue
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
package docker
|
||||||
|
|
||||||
|
import (
|
||||||
|
"dagger.io/dagger/engine"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Change image config
|
||||||
|
#Set: {
|
||||||
|
// The source image
|
||||||
|
input: #Image
|
||||||
|
|
||||||
|
// The image config to change
|
||||||
|
config: engine.#ImageConfig
|
||||||
|
|
||||||
|
_set: engine.#Set & {
|
||||||
|
"input": input.config
|
||||||
|
"config": config
|
||||||
|
}
|
||||||
|
|
||||||
|
// Resulting image with the config changes
|
||||||
|
output: #Image & {
|
||||||
|
rootfs: input.rootfs
|
||||||
|
config: _set.output
|
||||||
|
}
|
||||||
|
}
|
@ -22,3 +22,7 @@ setup() {
|
|||||||
dagger up ./run-export-directory-test.cue
|
dagger up ./run-export-directory-test.cue
|
||||||
dagger up ./image-config-test.cue
|
dagger up ./image-config-test.cue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@test "docker.#Set" {
|
||||||
|
dagger up ./set.cue
|
||||||
|
}
|
||||||
|
40
pkg/universe.dagger.io/docker/test/set.cue
Normal file
40
pkg/universe.dagger.io/docker/test/set.cue
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
package docker
|
||||||
|
|
||||||
|
import (
|
||||||
|
"dagger.io/dagger"
|
||||||
|
"dagger.io/dagger/engine"
|
||||||
|
"universe.dagger.io/docker"
|
||||||
|
)
|
||||||
|
|
||||||
|
dagger.#Plan & {
|
||||||
|
actions: {
|
||||||
|
image: output: docker.#Image & {
|
||||||
|
rootfs: engine.#Scratch
|
||||||
|
config: {
|
||||||
|
cmd: ["/bin/sh"]
|
||||||
|
env: PATH: "/sbin:/bin"
|
||||||
|
onbuild: ["COPY . /app"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
set: docker.#Set & {
|
||||||
|
input: image.output
|
||||||
|
config: {
|
||||||
|
env: FOO: "bar"
|
||||||
|
workdir: "/root"
|
||||||
|
onbuild: ["RUN /app/build.sh"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
verify: set.output.config & {
|
||||||
|
env: {
|
||||||
|
PATH: "/sbin:/bin"
|
||||||
|
FOO: "bar"
|
||||||
|
}
|
||||||
|
cmd: ["/bin/sh"]
|
||||||
|
workdir: "/root"
|
||||||
|
onbuild: [
|
||||||
|
"COPY . /app",
|
||||||
|
"RUN /app/build.sh",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user