Add OnBuild support for podman build

Only supported for docker formated images. OCI Does not support this flag.

Signed-off-by: Daniel J Walsh <dwalsh@redhat.com>
This commit is contained in:
Daniel J Walsh
2018-05-31 12:38:41 -04:00
parent ff3b46e769
commit 29c831f9d6
11 changed files with 49 additions and 9 deletions

2
API.md
View File

@ -153,7 +153,7 @@ method Commit(name: [string](https://godoc.org/builtin#string), image_name: [str
Commit, creates an image from an existing container. It requires the name or Commit, creates an image from an existing container. It requires the name or
ID of the container as well as the resulting image name. Optionally, you can define an author and message ID of the container as well as the resulting image name. Optionally, you can define an author and message
to be added to the resulting image. You can also define changes to the resulting image for the following to be added to the resulting image. You can also define changes to the resulting image for the following
attributes: _CMD, ENTRYPOINT, ENV, EXPOSE, LABEL, STOPSIGNAL, USER, VOLUME, and WORKDIR_. To pause the attributes: _CMD, ENTRYPOINT, ENV, EXPOSE, LABEL, ONBUILD, STOPSIGNAL, USER, VOLUME, and WORKDIR_. To pause the
container while it is being committed, pass a _true_ bool for the pause argument. If the container cannot container while it is being committed, pass a _true_ bool for the pause argument. If the container cannot
be found by the ID or name provided, a (ContainerNotFound)[#ContainerNotFound] error will be returned; otherwise, be found by the ID or name provided, a (ContainerNotFound)[#ContainerNotFound] error will be returned; otherwise,
the resulting image's ID will be returned as a string. the resulting image's ID will be returned as a string.

View File

@ -19,7 +19,7 @@ var (
commitFlags = []cli.Flag{ commitFlags = []cli.Flag{
cli.StringSliceFlag{ cli.StringSliceFlag{
Name: "change, c", Name: "change, c",
Usage: "Apply the following possible instructions to the created image (default []): CMD | ENTRYPOINT | ENV | EXPOSE | LABEL | STOPSIGNAL | USER | VOLUME | WORKDIR", Usage: fmt.Sprintf("Apply the following possible instructions to the created image (default []): %s", strings.Join(libpod.ChangeCmds, " | ")),
}, },
cli.StringFlag{ cli.StringFlag{
Name: "format, f", Name: "format, f",
@ -92,7 +92,7 @@ func commitCmd(c *cli.Context) error {
if c.IsSet("change") { if c.IsSet("change") {
for _, change := range c.StringSlice("change") { for _, change := range c.StringSlice("change") {
splitChange := strings.Split(strings.ToUpper(change), "=") splitChange := strings.Split(strings.ToUpper(change), "=")
if !util.StringInSlice(splitChange[0], []string{"CMD", "ENTRYPOINT", "ENV", "EXPOSE", "LABEL", "STOPSIGNAL", "USER", "VOLUME", "WORKDIR"}) { if !util.StringInSlice(splitChange[0], libpod.ChangeCmds) {
return errors.Errorf("invalid syntax for --change ", change) return errors.Errorf("invalid syntax for --change ", change)
} }
} }

View File

@ -531,7 +531,7 @@ method DeleteUnusedImages() -> (images: []string)
# Commit, creates an image from an existing container. It requires the name or # Commit, creates an image from an existing container. It requires the name or
# ID of the container as well as the resulting image name. Optionally, you can define an author and message # ID of the container as well as the resulting image name. Optionally, you can define an author and message
# to be added to the resulting image. You can also define changes to the resulting image for the following # to be added to the resulting image. You can also define changes to the resulting image for the following
# attributes: _CMD, ENTRYPOINT, ENV, EXPOSE, LABEL, STOPSIGNAL, USER, VOLUME, and WORKDIR_. To pause the # attributes: _CMD, ENTRYPOINT, ENV, EXPOSE, LABEL, ONBUILD, STOPSIGNAL, USER, VOLUME, and WORKDIR_. To pause the
# container while it is being committed, pass a _true_ bool for the pause argument. If the container cannot # container while it is being committed, pass a _true_ bool for the pause argument. If the container cannot
# be found by the ID or name provided, a (ContainerNotFound)[#ContainerNotFound] error will be returned; otherwise, # be found by the ID or name provided, a (ContainerNotFound)[#ContainerNotFound] error will be returned; otherwise,
# the resulting image's ID will be returned as a string. # the resulting image's ID will be returned as a string.

View File

@ -24,7 +24,9 @@ Set the author for the committed image
**--change, -c** **--change, -c**
Apply the following possible instructions to the created image: Apply the following possible instructions to the created image:
**CMD** | **ENTRYPOINT** | **ENV** | **EXPOSE** | **LABEL** | **STOPSIGNAL** | **USER** | **VOLUME** | **WORKDIR** **CMD** | **ENTRYPOINT** | **ENV** | **EXPOSE** | **LABEL** | **ONBUILD** | **STOPSIGNAL** | **USER** | **VOLUME** | **WORKDIR**
Can be set multiple times Can be set multiple times
**--format, -f** **--format, -f**

View File

@ -24,6 +24,9 @@ type ContainerCommitOptions struct {
Changes []string Changes []string
} }
// ChangeCmds is the list of valid Changes commands to passed to the Commit call
var ChangeCmds = []string{"CMD", "ENTRYPOINT", "ENV", "EXPOSE", "LABEL", "ONBUILD", "STOPSIGNAL", "USER", "VOLUME", "WORKDIR"}
// Commit commits the changes between a container and its image, creating a new // Commit commits the changes between a container and its image, creating a new
// image // image
func (c *Container) Commit(ctx context.Context, destImage string, options ContainerCommitOptions) (*image.Image, error) { func (c *Container) Commit(ctx context.Context, destImage string, options ContainerCommitOptions) (*image.Image, error) {
@ -138,6 +141,8 @@ func (c *Container) Commit(ctx context.Context, destImage string, options Contai
isLabelCleared = true isLabelCleared = true
} }
importBuilder.SetLabel(splitChange[1], splitChange[2]) importBuilder.SetLabel(splitChange[1], splitChange[2])
case "ONBUILD":
importBuilder.SetOnBuild(splitChange[1])
case "STOPSIGNAL": case "STOPSIGNAL":
// No Set StopSignal // No Set StopSignal
case "USER": case "USER":

View File

@ -88,7 +88,7 @@ k8s.io/kube-openapi 275e2ce91dec4c05a4094a7b1daee5560b555ac9 https://github.com/
k8s.io/utils 258e2a2fa64568210fbd6267cf1d8fd87c3cb86e https://github.com/kubernetes/utils k8s.io/utils 258e2a2fa64568210fbd6267cf1d8fd87c3cb86e https://github.com/kubernetes/utils
github.com/mrunalp/fileutils master github.com/mrunalp/fileutils master
github.com/varlink/go master github.com/varlink/go master
github.com/projectatomic/buildah 25f4e8ec639044bff4ab393188d083782f07b61c github.com/projectatomic/buildah b66e8531456e2986ffc409f591c9005813589a34
github.com/Nvveen/Gotty master github.com/Nvveen/Gotty master
github.com/fsouza/go-dockerclient master github.com/fsouza/go-dockerclient master
github.com/openshift/imagebuilder master github.com/openshift/imagebuilder master

View File

@ -52,6 +52,9 @@ type CommitOptions struct {
// Squash tells the builder to produce an image with a single layer // Squash tells the builder to produce an image with a single layer
// instead of with possibly more than one layer. // instead of with possibly more than one layer.
Squash bool Squash bool
// OnBuild is a list of commands to be run by images based on this image
OnBuild []string
} }
// PushOptions can be used to alter how an image is copied somewhere. // PushOptions can be used to alter how an image is copied somewhere.

View File

@ -331,6 +331,24 @@ func (b *Builder) SetUser(spec string) {
b.Docker.Config.User = spec b.Docker.Config.User = spec
} }
// OnBuild returns the OnBuild value from the container.
func (b *Builder) OnBuild() []string {
return copyStringSlice(b.Docker.Config.OnBuild)
}
// ClearOnBuild removes all values from the OnBuild structure
func (b *Builder) ClearOnBuild() {
b.Docker.Config.OnBuild = []string{}
}
// SetOnBuild sets a trigger instruction to be executed when the image is used
// as the base of another image.
// Note: this setting is not present in the OCIv1 image format, so it is
// discarded when writing images using OCIv1 formats.
func (b *Builder) SetOnBuild(onBuild string) {
b.Docker.Config.OnBuild = append(b.Docker.Config.OnBuild, onBuild)
}
// WorkDir returns the default working directory for running commands in the // WorkDir returns the default working directory for running commands in the
// container, or in a container built using an image built from this container. // container, or in a container built using an image built from this container.
func (b *Builder) WorkDir() string { func (b *Builder) WorkDir() string {
@ -348,7 +366,7 @@ func (b *Builder) SetWorkDir(there string) {
// Shell returns the default shell for running commands in the // Shell returns the default shell for running commands in the
// container, or in a container built using an image built from this container. // container, or in a container built using an image built from this container.
func (b *Builder) Shell() []string { func (b *Builder) Shell() []string {
return b.Docker.Config.Shell return copyStringSlice(b.Docker.Config.Shell)
} }
// SetShell sets the default shell for running // SetShell sets the default shell for running
@ -357,7 +375,7 @@ func (b *Builder) Shell() []string {
// Note: this setting is not present in the OCIv1 image format, so it is // Note: this setting is not present in the OCIv1 image format, so it is
// discarded when writing images using OCIv1 formats. // discarded when writing images using OCIv1 formats.
func (b *Builder) SetShell(shell []string) { func (b *Builder) SetShell(shell []string) {
b.Docker.Config.Shell = shell b.Docker.Config.Shell = copyStringSlice(shell)
} }
// Env returns a list of key-value pairs to be set when running commands in the // Env returns a list of key-value pairs to be set when running commands in the

View File

@ -138,6 +138,8 @@ type BuildOptions struct {
Labels []string Labels []string
// Annotation metadata for an image // Annotation metadata for an image
Annotations []string Annotations []string
// OnBuild commands to be run by images based on this image
OnBuild []string
} }
// Executor is a buildah-based implementation of the imagebuilder.Executor // Executor is a buildah-based implementation of the imagebuilder.Executor
@ -183,6 +185,7 @@ type Executor struct {
squash bool squash bool
labels []string labels []string
annotations []string annotations []string
onbuild []string
} }
// withName creates a new child executor that will be used whenever a COPY statement uses --from=NAME. // withName creates a new child executor that will be used whenever a COPY statement uses --from=NAME.
@ -598,6 +601,7 @@ func (b *Executor) Prepare(ctx context.Context, ib *imagebuilder.Builder, node *
Labels: builder.Labels(), Labels: builder.Labels(),
Shell: builder.Shell(), Shell: builder.Shell(),
StopSignal: builder.StopSignal(), StopSignal: builder.StopSignal(),
OnBuild: builder.OnBuild(),
} }
var rootfs *docker.RootFS var rootfs *docker.RootFS
if builder.Docker.RootFS != nil { if builder.Docker.RootFS != nil {
@ -714,6 +718,10 @@ func (b *Executor) Commit(ctx context.Context, ib *imagebuilder.Builder) (err er
for v := range config.Volumes { for v := range config.Volumes {
b.builder.AddVolume(v) b.builder.AddVolume(v)
} }
b.builder.ClearOnBuild()
for _, onBuildSpec := range config.OnBuild {
b.builder.SetOnBuild(onBuildSpec)
}
b.builder.SetWorkDir(config.WorkingDir) b.builder.SetWorkDir(config.WorkingDir)
b.builder.SetEntrypoint(config.Entrypoint) b.builder.SetEntrypoint(config.Entrypoint)
b.builder.SetShell(config.Shell) b.builder.SetShell(config.Shell)

View File

@ -37,7 +37,7 @@ func resolveChrootedSymlinks() {
os.Exit(1) os.Exit(1)
} }
// Our second paramter is the path name to evaluate for symbolic links // Our second parameter is the path name to evaluate for symbolic links
symLink, err := getSymbolicLink(flag.Arg(0), flag.Arg(1)) symLink, err := getSymbolicLink(flag.Arg(0), flag.Arg(1))
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "error getting symbolic links: %v\n", err) fmt.Fprintf(os.Stderr, "error getting symbolic links: %v\n", err)

View File

@ -152,6 +152,10 @@ var (
Name: "squash", Name: "squash",
Usage: "Squash newly built layers into a single new layer. Buildah does not currently support caching so this is a NOOP.", Usage: "Squash newly built layers into a single new layer. Buildah does not currently support caching so this is a NOOP.",
}, },
cli.BoolTFlag{
Name: "stream",
Usage: "There is no daemon in use, so this command is a NOOP.",
},
cli.StringSliceFlag{ cli.StringSliceFlag{
Name: "tag, t", Name: "tag, t",
Usage: "tagged `name` to apply to the built image", Usage: "tagged `name` to apply to the built image",