mirror of
https://github.com/containers/podman.git
synced 2025-06-25 20:26:51 +08:00
Merge pull request #7121 from rhatdan/build
Fix building from http or '-' options
This commit is contained in:
@ -138,36 +138,9 @@ func build(cmd *cobra.Command, args []string) error {
|
||||
return errors.New("cannot specify --squash, --squash-all and --layers options together")
|
||||
}
|
||||
|
||||
contextDir, containerFiles, err := extractContextAndFiles(args, buildOpts.File)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
ie, err := registry.NewImageEngine(cmd, args)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
apiBuildOpts, err := buildFlagsWrapperToOptions(cmd, contextDir, &buildOpts)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = ie.Build(registry.GetContext(), containerFiles, *apiBuildOpts)
|
||||
return err
|
||||
}
|
||||
|
||||
// extractContextAndFiles parses args and files to extract a context directory
|
||||
// and {Container,Docker}files.
|
||||
//
|
||||
// TODO: this was copied and altered from the v1 client which in turn was
|
||||
// copied and altered from the Buildah code. Ideally, all of this code should
|
||||
// be cleanly consolidated into a package that is shared between Buildah and
|
||||
// Podman.
|
||||
func extractContextAndFiles(args, files []string) (string, []string, error) {
|
||||
// Extract container files from the CLI (i.e., --file/-f) first.
|
||||
var containerFiles []string
|
||||
for _, f := range files {
|
||||
for _, f := range buildOpts.File {
|
||||
if f == "-" {
|
||||
containerFiles = append(containerFiles, "/dev/stdin")
|
||||
} else {
|
||||
@ -181,7 +154,7 @@ func extractContextAndFiles(args, files []string) (string, []string, error) {
|
||||
// The context directory could be a URL. Try to handle that.
|
||||
tempDir, subDir, err := imagebuildah.TempDirForURL("", "buildah", args[0])
|
||||
if err != nil {
|
||||
return "", nil, errors.Wrapf(err, "error prepping temporary context directory")
|
||||
return errors.Wrapf(err, "error prepping temporary context directory")
|
||||
}
|
||||
if tempDir != "" {
|
||||
// We had to download it to a temporary directory.
|
||||
@ -196,7 +169,7 @@ func extractContextAndFiles(args, files []string) (string, []string, error) {
|
||||
// Nope, it was local. Use it as is.
|
||||
absDir, err := filepath.Abs(args[0])
|
||||
if err != nil {
|
||||
return "", nil, errors.Wrapf(err, "error determining path to directory %q", args[0])
|
||||
return errors.Wrapf(err, "error determining path to directory %q", args[0])
|
||||
}
|
||||
contextDir = absDir
|
||||
}
|
||||
@ -212,7 +185,7 @@ func extractContextAndFiles(args, files []string) (string, []string, error) {
|
||||
}
|
||||
absFile, err := filepath.Abs(containerFiles[i])
|
||||
if err != nil {
|
||||
return "", nil, errors.Wrapf(err, "error determining path to file %q", containerFiles[i])
|
||||
return errors.Wrapf(err, "error determining path to file %q", containerFiles[i])
|
||||
}
|
||||
contextDir = filepath.Dir(absFile)
|
||||
break
|
||||
@ -220,10 +193,10 @@ func extractContextAndFiles(args, files []string) (string, []string, error) {
|
||||
}
|
||||
|
||||
if contextDir == "" {
|
||||
return "", nil, errors.Errorf("no context directory and no Containerfile specified")
|
||||
return errors.Errorf("no context directory and no Containerfile specified")
|
||||
}
|
||||
if !utils.IsDir(contextDir) {
|
||||
return "", nil, errors.Errorf("context must be a directory: %q", contextDir)
|
||||
return errors.Errorf("context must be a directory: %q", contextDir)
|
||||
}
|
||||
if len(containerFiles) == 0 {
|
||||
if utils.FileExists(filepath.Join(contextDir, "Containerfile")) {
|
||||
@ -233,7 +206,18 @@ func extractContextAndFiles(args, files []string) (string, []string, error) {
|
||||
}
|
||||
}
|
||||
|
||||
return contextDir, containerFiles, nil
|
||||
ie, err := registry.NewImageEngine(cmd, args)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
apiBuildOpts, err := buildFlagsWrapperToOptions(cmd, contextDir, &buildOpts)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = ie.Build(registry.GetContext(), containerFiles, *apiBuildOpts)
|
||||
return err
|
||||
}
|
||||
|
||||
// buildFlagsWrapperToOptions converts the local build flags to the build options used
|
||||
|
@ -233,6 +233,27 @@ Labels.$label_name | $label_value
|
||||
run_podman rmi -f build_test
|
||||
}
|
||||
|
||||
@test "podman build - stdin test" {
|
||||
if is_remote && is_rootless; then
|
||||
skip "unreliable with podman-remote and rootless; #2972"
|
||||
fi
|
||||
|
||||
# Random workdir, and multiple random strings to verify command & env
|
||||
workdir=/$(random_string 10)
|
||||
PODMAN_TIMEOUT=240 run_podman build -t build_test - << EOF
|
||||
FROM $IMAGE
|
||||
RUN mkdir $workdir
|
||||
WORKDIR $workdir
|
||||
RUN /bin/echo 'Test'
|
||||
EOF
|
||||
is "$output" ".*STEP 5: COMMIT" "COMMIT seen in log"
|
||||
|
||||
run_podman run --rm build_test pwd
|
||||
is "$output" "$workdir" "pwd command in container"
|
||||
|
||||
run_podman rmi -f build_test
|
||||
}
|
||||
|
||||
function teardown() {
|
||||
# A timeout or other error in 'build' can leave behind stale images
|
||||
# that podman can't even see and which will cascade into subsequent
|
||||
|
Reference in New Issue
Block a user