diff options
-rw-r--r-- | .gitignore | 4 | ||||
-rw-r--r-- | Makefile | 3 | ||||
-rw-r--r-- | contrib/build_rpm.sh | 2 | ||||
-rw-r--r-- | contrib/spec/podman.spec.in | 13 | ||||
-rw-r--r-- | libpod/container_internal_linux.go | 4 | ||||
-rw-r--r-- | test/e2e/checkpoint_test.go | 43 |
6 files changed, 65 insertions, 4 deletions
diff --git a/.gitignore b/.gitignore index 54b63518f..f14f08396 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,7 @@ /.artifacts/ /_output/ /brew -/conmon/conmon.o +/conmon/ /docs/*.[158] /docs/*.[158].gz /docs/remote @@ -27,3 +27,5 @@ podman-remote*.zip podman*.tar.gz .idea* .vscode* +contrib/spec/podman.spec +*.rpm @@ -32,6 +32,7 @@ BUILDTAGS ?= \ exclude_graphdriver_devicemapper \ seccomp \ varlink +PYTHON ?= $(shell command -v python python3) GO_BUILD=$(GO) build # Go module support: set `-mod=vendor` to use the vendored sources @@ -133,7 +134,7 @@ endef export PRINT_HELP_PYSCRIPT help: - @python -c "$$PRINT_HELP_PYSCRIPT" < $(MAKEFILE_LIST) + @$(PYTHON) -c "$$PRINT_HELP_PYSCRIPT" < $(MAKEFILE_LIST) .gopathok: ifeq ("$(wildcard $(GOPKGDIR))","") diff --git a/contrib/build_rpm.sh b/contrib/build_rpm.sh index 628654339..b2560fb1a 100644 --- a/contrib/build_rpm.sh +++ b/contrib/build_rpm.sh @@ -1,5 +1,5 @@ #!/bin/bash -set -x +set -euxo pipefail pkg_manager=`command -v dnf` if [ -z "$pkg_manager" ]; then diff --git a/contrib/spec/podman.spec.in b/contrib/spec/podman.spec.in index 7035297dd..f282642f3 100644 --- a/contrib/spec/podman.spec.in +++ b/contrib/spec/podman.spec.in @@ -3,6 +3,7 @@ %global with_debug 1 %global with_check 0 %global with_unit_test 0 +%global with_doc 1 %if 0%{?fedora} >= 28 %bcond_without varlink @@ -60,7 +61,9 @@ BuildRequires: glib2-devel BuildRequires: glibc-devel BuildRequires: glibc-static BuildRequires: git +%if 0%{?with_doc} BuildRequires: go-md2man +%endif BuildRequires: gpgme-devel BuildRequires: libassuan-devel BuildRequires: libgpg-error-devel @@ -360,7 +363,9 @@ tar zxf %{SOURCE1} sed -i 's/install.remote: podman-remote/install.remote:/' Makefile sed -i 's/install.bin: podman/install.bin:/' Makefile +%if 0%{?with_doc} sed -i 's/install.man: docs/install.man:/' Makefile +%endif %build mkdir _build @@ -373,8 +378,12 @@ export GOPATH=$(pwd)/_build:$(pwd):$(pwd):%{gopath} export BUILDTAGS="varlink selinux seccomp $(hack/btrfs_installed_tag.sh) $(hack/btrfs_tag.sh) $(hack/libdm_tag.sh) exclude_graphdriver_devicemapper" GOPATH=$GOPATH go generate ./cmd/podman/varlink/... -BUILDTAGS=$BUILDTAGS make binaries docs +%if 0%{?with_doc} +BUILDTAGS=$BUILDTAGS make binaries docs +%else +BUILDTAGS=$BUILDTAGS make binaries +%endif # build conmon pushd conmon @@ -480,8 +489,10 @@ export GOPATH=%{buildroot}/%{gopath}:$(pwd)/vendor:%{gopath} %license LICENSE %doc README.md CONTRIBUTING.md pkg/hooks/README-hooks.md install.md code-of-conduct.md transfer.md %{_bindir}/%{name} +%if 0%{?with_doc} %{_mandir}/man1/*.1* %{_mandir}/man5/*.5* +%endif %{_datadir}/bash-completion/completions/* %{_datadir}/zsh/site-functions/* %{_libexecdir}/%{name}/conmon diff --git a/libpod/container_internal_linux.go b/libpod/container_internal_linux.go index 2ecd5911a..f051f40e9 100644 --- a/libpod/container_internal_linux.go +++ b/libpod/container_internal_linux.go @@ -676,6 +676,10 @@ func (c *Container) checkpoint(ctx context.Context, options ContainerCheckpointO return errors.Wrapf(define.ErrCtrStateInvalid, "%q is not running, cannot checkpoint", c.state.State) } + if c.AutoRemove() && options.TargetFile == "" { + return errors.Errorf("Cannot checkpoint containers that have been started with '--rm' unless '--export' is used") + } + if err := c.checkpointRestoreLabelLog("dump.log"); err != nil { return err } diff --git a/test/e2e/checkpoint_test.go b/test/e2e/checkpoint_test.go index 2d3efcbef..f208a4cf0 100644 --- a/test/e2e/checkpoint_test.go +++ b/test/e2e/checkpoint_test.go @@ -588,4 +588,47 @@ var _ = Describe("Podman checkpoint", func() { // Remove exported checkpoint os.Remove(fileName) }) + + It("podman checkpoint a container started with --rm", func() { + // Start the container + localRunString := getRunString([]string{"--rm", ALPINE, "top"}) + session := podmanTest.Podman(localRunString) + session.WaitWithDefaultTimeout() + cid := session.OutputToString() + Expect(podmanTest.NumberOfContainersRunning()).To(Equal(1)) + + // Checkpoint the container - this should fail as it was started with --rm + result := podmanTest.Podman([]string{"container", "checkpoint", "-l"}) + result.WaitWithDefaultTimeout() + Expect(result).To(ExitWithError()) + Expect(result.ErrorToString()).To(ContainSubstring("Cannot checkpoint containers that have been started with '--rm'")) + + // Checkpointing with --export should still work + fileName := "/tmp/checkpoint-" + cid + ".tar.gz" + + result = podmanTest.Podman([]string{"container", "checkpoint", "-l", "-e", fileName}) + result.WaitWithDefaultTimeout() + + // As the container has been started with '--rm' it will be completely + // cleaned up after checkpointing. + Expect(result.ExitCode()).To(Equal(0)) + Expect(podmanTest.NumberOfContainersRunning()).To(Equal(0)) + Expect(podmanTest.NumberOfContainers()).To(Equal(0)) + + result = podmanTest.Podman([]string{"container", "restore", "-i", fileName}) + result.WaitWithDefaultTimeout() + + Expect(result.ExitCode()).To(Equal(0)) + Expect(podmanTest.NumberOfContainersRunning()).To(Equal(1)) + Expect(podmanTest.GetContainerStatus()).To(ContainSubstring("Up")) + + result = podmanTest.Podman([]string{"rm", "-fa"}) + result.WaitWithDefaultTimeout() + Expect(result.ExitCode()).To(Equal(0)) + Expect(podmanTest.NumberOfContainersRunning()).To(Equal(0)) + Expect(podmanTest.NumberOfContainers()).To(Equal(0)) + + // Remove exported checkpoint + os.Remove(fileName) + }) }) |