mirror of
https://github.com/containers/podman.git
synced 2025-06-26 12:56:45 +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")
|
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.
|
// Extract container files from the CLI (i.e., --file/-f) first.
|
||||||
var containerFiles []string
|
var containerFiles []string
|
||||||
for _, f := range files {
|
for _, f := range buildOpts.File {
|
||||||
if f == "-" {
|
if f == "-" {
|
||||||
containerFiles = append(containerFiles, "/dev/stdin")
|
containerFiles = append(containerFiles, "/dev/stdin")
|
||||||
} else {
|
} else {
|
||||||
@ -181,7 +154,7 @@ func extractContextAndFiles(args, files []string) (string, []string, error) {
|
|||||||
// The context directory could be a URL. Try to handle that.
|
// The context directory could be a URL. Try to handle that.
|
||||||
tempDir, subDir, err := imagebuildah.TempDirForURL("", "buildah", args[0])
|
tempDir, subDir, err := imagebuildah.TempDirForURL("", "buildah", args[0])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", nil, errors.Wrapf(err, "error prepping temporary context directory")
|
return errors.Wrapf(err, "error prepping temporary context directory")
|
||||||
}
|
}
|
||||||
if tempDir != "" {
|
if tempDir != "" {
|
||||||
// We had to download it to a temporary directory.
|
// 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.
|
// Nope, it was local. Use it as is.
|
||||||
absDir, err := filepath.Abs(args[0])
|
absDir, err := filepath.Abs(args[0])
|
||||||
if err != nil {
|
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
|
contextDir = absDir
|
||||||
}
|
}
|
||||||
@ -212,7 +185,7 @@ func extractContextAndFiles(args, files []string) (string, []string, error) {
|
|||||||
}
|
}
|
||||||
absFile, err := filepath.Abs(containerFiles[i])
|
absFile, err := filepath.Abs(containerFiles[i])
|
||||||
if err != nil {
|
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)
|
contextDir = filepath.Dir(absFile)
|
||||||
break
|
break
|
||||||
@ -220,10 +193,10 @@ func extractContextAndFiles(args, files []string) (string, []string, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if contextDir == "" {
|
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) {
|
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 len(containerFiles) == 0 {
|
||||||
if utils.FileExists(filepath.Join(contextDir, "Containerfile")) {
|
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
|
// 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
|
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() {
|
function teardown() {
|
||||||
# A timeout or other error in 'build' can leave behind stale images
|
# A timeout or other error in 'build' can leave behind stale images
|
||||||
# that podman can't even see and which will cascade into subsequent
|
# that podman can't even see and which will cascade into subsequent
|
||||||
|
Reference in New Issue
Block a user