Merge pull request #2823 from TomSweeneyRedHat/dev/tsweeney/override_from
Allow FROM to be overriden with from option
This commit is contained in:
commit
7734b68d6a
|
@ -318,6 +318,7 @@ func budCmd(c *cobra.Command, inputArgs []string, iopts budOptions) error {
|
|||
DropCapabilities: iopts.CapDrop,
|
||||
Err: stderr,
|
||||
ForceRmIntermediateCtrs: iopts.ForceRm,
|
||||
From: iopts.From,
|
||||
IDMappingOptions: idmappingOptions,
|
||||
IIDFile: iopts.Iidfile,
|
||||
Isolation: isolation,
|
||||
|
|
|
@ -61,6 +61,9 @@ instructions read from the Containerfiles in the same way that environment
|
|||
variables are, but which will not be added to environment variable list in the
|
||||
resulting image's configuration.
|
||||
|
||||
Please refer to the [BUILD TIME VARIABLES](#build-time-variables) section for the
|
||||
list of variables that can be overridden within the Containerfile at run time.
|
||||
|
||||
**--cache-from**
|
||||
|
||||
Images to utilise as potential cache sources. Buildah does not currently support caching so this is a NOOP.
|
||||
|
@ -264,6 +267,11 @@ Recognized formats include *oci* (OCI image-spec v1.0, the default) and
|
|||
Note: You can also override the default format by setting the BUILDAH\_FORMAT
|
||||
environment variable. `export BUILDAH_FORMAT=docker`
|
||||
|
||||
**--from**
|
||||
|
||||
Overrides the first `FROM` instruction within the Containerfile. If there are multiple
|
||||
FROM instructions in a Containerfile, only the first is changed.
|
||||
|
||||
**-h**, **--help**
|
||||
|
||||
Print usage statement
|
||||
|
@ -666,6 +674,23 @@ will convert /foo into a `shared` mount point. The propagation properties of th
|
|||
mount can be changed directly. For instance if `/` is the source mount for
|
||||
`/foo`, then use `mount --make-shared /` to convert `/` into a `shared` mount.
|
||||
|
||||
## BUILD TIME VARIABLES
|
||||
|
||||
The ENV instruction in a Containerfile can be used to define variable values. When the image
|
||||
is built, the values will persist in the container image. At times it is more convenient to
|
||||
change the values in the Containerfile via a command-line option rather than changing the
|
||||
values within the Containerfile itself.
|
||||
|
||||
The following variables can be used in conjunction with the `--build-arg` option to override the
|
||||
corresponding values set in the Containerfile using the `ENV` instruction.
|
||||
|
||||
* HTTP_PROXY
|
||||
* HTTPS_PROXY
|
||||
* FTP_PROXY
|
||||
* NO_PROXY
|
||||
|
||||
Please refer to the [Using Build Time Variables](#using-build-time-variables) section of the Examples.
|
||||
|
||||
## EXAMPLE
|
||||
|
||||
### Build an image using local Containerfiles
|
||||
|
@ -727,6 +752,11 @@ buildah bud --dns-search=example.com --dns=223.5.5.5 --dns-option=use-vc .
|
|||
|
||||
Note: supported compression formats are 'xz', 'bzip2', 'gzip' and 'identity' (no compression).
|
||||
|
||||
### Using Build Time Variables
|
||||
#### Replace the value set for the HTTP_PROXY environment variable within the Containerfile.
|
||||
|
||||
buildah bud --build-arg=HTTP_PROXY="http://127.0.0.1:8321"
|
||||
|
||||
## ENVIRONMENT
|
||||
|
||||
**BUILD\_REGISTRY\_SOURCES**
|
||||
|
|
|
@ -187,6 +187,9 @@ type BuildOptions struct {
|
|||
LogRusage bool
|
||||
// Excludes is a list of excludes to be used instead of the .dockerignore file.
|
||||
Excludes []string
|
||||
// From is the image name to use to replace the value specified in the first
|
||||
// FROM instruction in the Containerfile
|
||||
From string
|
||||
}
|
||||
|
||||
// BuildDockerfiles parses a set of one or more Dockerfiles (which may be
|
||||
|
|
|
@ -114,6 +114,7 @@ type Executor struct {
|
|||
logRusage bool
|
||||
imageInfoLock sync.Mutex
|
||||
imageInfoCache map[string]imageTypeAndHistoryAndDiffIDs
|
||||
fromOverride string
|
||||
}
|
||||
|
||||
type imageTypeAndHistoryAndDiffIDs struct {
|
||||
|
@ -229,6 +230,7 @@ func NewExecutor(store storage.Store, options BuildOptions, mainNode *parser.Nod
|
|||
jobs: jobs,
|
||||
logRusage: options.LogRusage,
|
||||
imageInfoCache: make(map[string]imageTypeAndHistoryAndDiffIDs),
|
||||
fromOverride: options.From,
|
||||
}
|
||||
if exec.err == nil {
|
||||
exec.err = os.Stderr
|
||||
|
@ -245,6 +247,7 @@ func NewExecutor(store storage.Store, options BuildOptions, mainNode *parser.Nod
|
|||
fmt.Fprintf(exec.out, prefix+format+suffix, args...)
|
||||
}
|
||||
}
|
||||
|
||||
for arg := range options.Args {
|
||||
if _, isBuiltIn := builtinAllowedBuildArgs[arg]; !isBuiltIn {
|
||||
exec.unusedArgs[arg] = struct{}{}
|
||||
|
@ -522,6 +525,12 @@ func (b *Executor) Build(ctx context.Context, stages imagebuilder.Stages) (image
|
|||
switch strings.ToUpper(child.Value) { // first token - instruction
|
||||
case "FROM":
|
||||
if child.Next != nil { // second token on this line
|
||||
// If we have a fromOverride, replace the value of
|
||||
// image name for the first FROM in the Containerfile.
|
||||
if b.fromOverride != "" {
|
||||
child.Next.Value = b.fromOverride
|
||||
b.fromOverride = ""
|
||||
}
|
||||
base := child.Next.Value
|
||||
if base != "scratch" {
|
||||
// TODO: this didn't undergo variable and arg
|
||||
|
|
|
@ -63,6 +63,7 @@ type BudResults struct {
|
|||
IgnoreFile string
|
||||
File []string
|
||||
Format string
|
||||
From string
|
||||
Iidfile string
|
||||
Label []string
|
||||
Logfile string
|
||||
|
@ -187,6 +188,7 @@ func GetBudFlags(flags *BudResults) pflag.FlagSet {
|
|||
fs.StringVar(&flags.Creds, "creds", "", "use `[username[:password]]` for accessing the registry")
|
||||
fs.BoolVarP(&flags.DisableCompression, "disable-compression", "D", true, "don't compress layers by default")
|
||||
fs.BoolVar(&flags.DisableContentTrust, "disable-content-trust", false, "This is a Docker specific option and is a NOOP")
|
||||
fs.StringVar(&flags.From, "from", "", "image name used to replace the value in the first FROM instruction in the Containerfile")
|
||||
fs.StringVar(&flags.IgnoreFile, "ignorefile", "", "path to an alternate .dockerignore file")
|
||||
fs.StringSliceVarP(&flags.File, "file", "f", []string{}, "`pathname or URL` of a Dockerfile")
|
||||
fs.StringVar(&flags.Format, "format", DefaultFormat(), "`format` of the built image's manifest and metadata. Use BUILDAH_FORMAT environment variable to override.")
|
||||
|
@ -233,6 +235,7 @@ func GetBudFlagsCompletions() commonComp.FlagCompletions {
|
|||
flagCompletion["cert-dir"] = commonComp.AutocompleteDefault
|
||||
flagCompletion["creds"] = commonComp.AutocompleteNone
|
||||
flagCompletion["file"] = commonComp.AutocompleteDefault
|
||||
flagCompletion["from"] = commonComp.AutocompleteDefault
|
||||
flagCompletion["format"] = commonComp.AutocompleteNone
|
||||
flagCompletion["ignorefile"] = commonComp.AutocompleteDefault
|
||||
flagCompletion["iidfile"] = commonComp.AutocompleteDefault
|
||||
|
|
|
@ -2430,5 +2430,14 @@ EOF
|
|||
expect_output --substring "FROM alpine"
|
||||
|
||||
run_buildah 125 bud --network=bogus --signature-policy ${TESTSDIR}/policy.json -t ${target} ${TESTSDIR}/bud/containerfile
|
||||
expect_output "error checking for network namespace: stat bogus: no such file or directory"
|
||||
|
||||
}
|
||||
|
||||
@test "bud-replace-from-in-containerfile" {
|
||||
_prefetch alpine
|
||||
# override the first FROM (fedora) image in the Containerfile
|
||||
# with alpine, leave the second (busybox) alone.
|
||||
run_buildah bud --signature-policy ${TESTSDIR}/policy.json --from=alpine ${TESTSDIR}/bud/build-with-from
|
||||
expect_output --substring "STEP 1: FROM alpine AS builder"
|
||||
expect_output --substring "STEP 2: FROM busybox"
|
||||
}
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
FROM fedora as builder
|
||||
FROM busybox
|
||||
COPY --from=builder /bin/df /tmp/df_tester
|
||||
|
Loading…
Reference in New Issue