Add support for creating toolboxes from Containerfile
Signed-off-by: William Brawner <me@wbrawner.com>
This commit is contained in:
parent
f28ad7749f
commit
ed7398f2f7
2 changed files with 77 additions and 1 deletions
|
@ -6,6 +6,7 @@ toolbox\-create - Create a new toolbox container
|
||||||
## SYNOPSIS
|
## SYNOPSIS
|
||||||
**toolbox create** [*--authfile FILE*]
|
**toolbox create** [*--authfile FILE*]
|
||||||
[*--distro DISTRO* | *-d DISTRO*]
|
[*--distro DISTRO* | *-d DISTRO*]
|
||||||
|
[*--file CONTAINERFILE* | *-f CONTAINERFILE*]
|
||||||
[*--image NAME* | *-i NAME*]
|
[*--image NAME* | *-i NAME*]
|
||||||
[*--release RELEASE* | *-r RELEASE*]
|
[*--release RELEASE* | *-r RELEASE*]
|
||||||
[*CONTAINER*]
|
[*CONTAINER*]
|
||||||
|
@ -95,6 +96,12 @@ Create a toolbox container for a different operating system DISTRO than the
|
||||||
host. Cannot be used with `--image`. Has to be coupled with `--release` unless
|
host. Cannot be used with `--image`. Has to be coupled with `--release` unless
|
||||||
the selected DISTRO matches the host.
|
the selected DISTRO matches the host.
|
||||||
|
|
||||||
|
**--file** CONTAINERFILE, **-f** CONTAINERFILE
|
||||||
|
|
||||||
|
Create a toolbox container from a Containerfile. If used with `--image`, then
|
||||||
|
the built image will be tagged with that value, otherwise the current directory
|
||||||
|
name will be used.
|
||||||
|
|
||||||
**--image** NAME, **-i** NAME
|
**--image** NAME, **-i** NAME
|
||||||
|
|
||||||
Change the NAME of the image used to create the toolbox container. This is
|
Change the NAME of the image used to create the toolbox container. This is
|
||||||
|
@ -136,6 +143,12 @@ $ toolbox create --image bar foo
|
||||||
$ toolbox create --authfile ~/auth.json --image registry.example.com/bar
|
$ toolbox create --authfile ~/auth.json --image registry.example.com/bar
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Create a custom toolbox container from a Containerfile
|
||||||
|
|
||||||
|
```
|
||||||
|
$ toolbox create --file Containerfile
|
||||||
|
```
|
||||||
|
|
||||||
## SEE ALSO
|
## SEE ALSO
|
||||||
|
|
||||||
`toolbox(1)`, `toolbox-init-container(1)`, `podman(1)`, `podman-create(1)`, `podman-login(1)`, `podman-pull(1)`, `containers-auth.json(5)`
|
`toolbox(1)`, `toolbox-init-container(1)`, `podman(1)`, `podman-create(1)`, `podman-login(1)`, `podman-pull(1)`, `containers-auth.json(5)`
|
||||||
|
|
|
@ -20,6 +20,7 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
|
"path"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
@ -47,6 +48,7 @@ var (
|
||||||
authFile string
|
authFile string
|
||||||
container string
|
container string
|
||||||
distro string
|
distro string
|
||||||
|
file string
|
||||||
image string
|
image string
|
||||||
release string
|
release string
|
||||||
}
|
}
|
||||||
|
@ -87,6 +89,12 @@ func init() {
|
||||||
"",
|
"",
|
||||||
"Create a toolbox container for a different operating system distribution than the host")
|
"Create a toolbox container for a different operating system distribution than the host")
|
||||||
|
|
||||||
|
flags.StringVarP(&createFlags.file,
|
||||||
|
"file",
|
||||||
|
"f",
|
||||||
|
"",
|
||||||
|
"Create a toolbox container from the given Containerfile")
|
||||||
|
|
||||||
flags.StringVarP(&createFlags.image,
|
flags.StringVarP(&createFlags.image,
|
||||||
"image",
|
"image",
|
||||||
"i",
|
"i",
|
||||||
|
@ -168,10 +176,43 @@ func create(cmd *cobra.Command, args []string) error {
|
||||||
containerArg = "--container"
|
containerArg = "--container"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
image := createFlags.image
|
||||||
|
|
||||||
|
if cmd.Flag("file").Changed {
|
||||||
|
if !utils.PathExists(createFlags.file) {
|
||||||
|
var builder strings.Builder
|
||||||
|
fmt.Fprintf(&builder, "file %s not found\n", createFlags.authFile)
|
||||||
|
fmt.Fprintf(&builder, "Run '%s --help' for usage.", executableBase)
|
||||||
|
|
||||||
|
errMsg := builder.String()
|
||||||
|
return errors.New(errMsg)
|
||||||
|
}
|
||||||
|
|
||||||
|
var err error
|
||||||
|
if container == "" {
|
||||||
|
container, err = dirname()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if image == "" {
|
||||||
|
image, err = dirname()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
err = buildContainerImage(image, createFlags.file)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
container, image, release, err := resolveContainerAndImageNames(container,
|
container, image, release, err := resolveContainerAndImageNames(container,
|
||||||
containerArg,
|
containerArg,
|
||||||
createFlags.distro,
|
createFlags.distro,
|
||||||
createFlags.image,
|
image,
|
||||||
createFlags.release)
|
createFlags.release)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -185,6 +226,20 @@ func create(cmd *cobra.Command, args []string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func buildContainerImage(image, containerFile string) error {
|
||||||
|
buildArgs := []string{
|
||||||
|
"build",
|
||||||
|
"--file",
|
||||||
|
containerFile,
|
||||||
|
"--tag",
|
||||||
|
image,
|
||||||
|
}
|
||||||
|
if err := shell.Run("podman", nil, nil, nil, buildArgs...); err != nil {
|
||||||
|
return fmt.Errorf("failed to build image %s", image)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func createContainer(container, image, release, authFile string, showCommandToEnter bool) error {
|
func createContainer(container, image, release, authFile string, showCommandToEnter bool) error {
|
||||||
if container == "" {
|
if container == "" {
|
||||||
panic("container not specified")
|
panic("container not specified")
|
||||||
|
@ -781,3 +836,11 @@ func systemdPathBusEscape(path string) string {
|
||||||
}
|
}
|
||||||
return string(n)
|
return string(n)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func dirname() (string, error) {
|
||||||
|
cwd, err := os.Getwd()
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return path.Base(cwd), nil
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue