diff options
-rw-r--r-- | cmd/podman/system/reset.go | 21 | ||||
-rw-r--r-- | pkg/domain/entities/engine_container.go | 1 | ||||
-rw-r--r-- | pkg/domain/infra/abi/containers.go | 4 | ||||
-rw-r--r-- | pkg/domain/infra/tunnel/containers.go | 6 | ||||
-rw-r--r-- | pkg/ps/ps.go | 34 | ||||
-rw-r--r-- | troubleshooting.md | 22 |
6 files changed, 74 insertions, 14 deletions
diff --git a/cmd/podman/system/reset.go b/cmd/podman/system/reset.go index 0edb36889..c64d09ed2 100644 --- a/cmd/podman/system/reset.go +++ b/cmd/podman/system/reset.go @@ -45,16 +45,29 @@ func init() { } func reset(cmd *cobra.Command, args []string) { + // Get all the external containers in use + listCtn, _ := registry.ContainerEngine().ContainerListExternal(registry.Context()) + listCtnIds := make([]string, 0, len(listCtn)) + for _, externalCtn := range listCtn { + listCtnIds = append(listCtnIds, externalCtn.ID) + } // Prompt for confirmation if --force is not set if !forceFlag { reader := bufio.NewReader(os.Stdin) - fmt.Print(` + fmt.Println(` WARNING! This will remove: - all containers - all pods - all images - - all build cache -Are you sure you want to continue? [y/N] `) + - all build cache`) + if len(listCtn) > 0 { + fmt.Println(`WARNING! The following external containers will be purged:`) + // print first 12 characters of ID and first configured name alias + for _, externalCtn := range listCtn { + fmt.Printf(" - %s (%s)\n", externalCtn.ID[0:12], externalCtn.Names[0]) + } + } + fmt.Print(`Are you sure you want to continue? [y/N] `) answer, err := reader.ReadString('\n') if err != nil { logrus.Error(err) @@ -65,6 +78,8 @@ Are you sure you want to continue? [y/N] `) } } + // Purge all the external containers with storage + registry.ContainerEngine().ContainerRm(registry.Context(), listCtnIds, entities.RmOptions{Force: true, All: true, Ignore: true, Volumes: true}) // Shutdown all running engines, `reset` will hijack repository registry.ContainerEngine().Shutdown(registry.Context()) registry.ImageEngine().Shutdown(registry.Context()) diff --git a/pkg/domain/entities/engine_container.go b/pkg/domain/entities/engine_container.go index f695d32fd..4cd3cfd2a 100644 --- a/pkg/domain/entities/engine_container.go +++ b/pkg/domain/entities/engine_container.go @@ -32,6 +32,7 @@ type ContainerEngine interface { ContainerInspect(ctx context.Context, namesOrIds []string, options InspectOptions) ([]*ContainerInspectReport, []error, error) ContainerKill(ctx context.Context, namesOrIds []string, options KillOptions) ([]*KillReport, error) ContainerList(ctx context.Context, options ContainerListOptions) ([]ListContainer, error) + ContainerListExternal(ctx context.Context) ([]ListContainer, error) ContainerLogs(ctx context.Context, containers []string, options ContainerLogsOptions) error ContainerMount(ctx context.Context, nameOrIDs []string, options ContainerMountOptions) ([]*ContainerMountReport, error) ContainerPause(ctx context.Context, namesOrIds []string, options PauseUnPauseOptions) ([]*PauseUnpauseReport, error) diff --git a/pkg/domain/infra/abi/containers.go b/pkg/domain/infra/abi/containers.go index e6dd19e63..47fa553ce 100644 --- a/pkg/domain/infra/abi/containers.go +++ b/pkg/domain/infra/abi/containers.go @@ -854,6 +854,10 @@ func (ic *ContainerEngine) ContainerList(ctx context.Context, options entities.C return ps.GetContainerLists(ic.Libpod, options) } +func (ic *ContainerEngine) ContainerListExternal(ctx context.Context) ([]entities.ListContainer, error) { + return ps.GetExternalContainerLists(ic.Libpod) +} + // ContainerDiff provides changes to given container func (ic *ContainerEngine) ContainerDiff(ctx context.Context, nameOrID string, opts entities.DiffOptions) (*entities.DiffReport, error) { if opts.Latest { diff --git a/pkg/domain/infra/tunnel/containers.go b/pkg/domain/infra/tunnel/containers.go index 0047fc839..ccebfffa4 100644 --- a/pkg/domain/infra/tunnel/containers.go +++ b/pkg/domain/infra/tunnel/containers.go @@ -646,6 +646,12 @@ func (ic *ContainerEngine) ContainerList(ctx context.Context, opts entities.Cont return containers.List(ic.ClientCtx, options) } +func (ic *ContainerEngine) ContainerListExternal(ctx context.Context) ([]entities.ListContainer, error) { + options := new(containers.ListOptions).WithAll(true) + options.WithNamespace(true).WithSize(true).WithSync(true).WithExternal(true) + return containers.List(ic.ClientCtx, options) +} + func (ic *ContainerEngine) ContainerRun(ctx context.Context, opts entities.ContainerRunOptions) (*entities.ContainerRunReport, error) { con, err := containers.CreateWithSpec(ic.ClientCtx, opts.Spec, nil) if err != nil { diff --git a/pkg/ps/ps.go b/pkg/ps/ps.go index 0b76636de..ef79973d6 100644 --- a/pkg/ps/ps.go +++ b/pkg/ps/ps.go @@ -71,18 +71,11 @@ func GetContainerLists(runtime *libpod.Runtime, options entities.ContainerListOp } if options.All && options.External { - externCons, err := runtime.StorageContainers() + listCon, err := GetExternalContainerLists(runtime) if err != nil { return nil, err } - - for _, con := range externCons { - listCon, err := ListStorageContainer(runtime, con, options) - if err != nil { - return nil, err - } - pss = append(pss, listCon) - } + pss = append(pss, listCon...) } // Sort the containers we got @@ -97,6 +90,27 @@ func GetContainerLists(runtime *libpod.Runtime, options entities.ContainerListOp return pss, nil } +// GetExternalContainerLists returns list of external containers for e.g created by buildah +func GetExternalContainerLists(runtime *libpod.Runtime) ([]entities.ListContainer, error) { + var ( + pss = []entities.ListContainer{} + ) + + externCons, err := runtime.StorageContainers() + if err != nil { + return nil, err + } + + for _, con := range externCons { + listCon, err := ListStorageContainer(runtime, con) + if err != nil { + return nil, err + } + pss = append(pss, listCon) + } + return pss, nil +} + // BatchContainerOp is used in ps to reduce performance hits by "batching" // locks. func ListContainerBatch(rt *libpod.Runtime, ctr *libpod.Container, opts entities.ContainerListOptions) (entities.ListContainer, error) { @@ -231,7 +245,7 @@ func ListContainerBatch(rt *libpod.Runtime, ctr *libpod.Container, opts entities return ps, nil } -func ListStorageContainer(rt *libpod.Runtime, ctr storage.Container, opts entities.ContainerListOptions) (entities.ListContainer, error) { +func ListStorageContainer(rt *libpod.Runtime, ctr storage.Container) (entities.ListContainer, error) { name := "unknown" if len(ctr.Names) > 0 { name = ctr.Names[0] diff --git a/troubleshooting.md b/troubleshooting.md index ab9fffeb3..575ee16b8 100644 --- a/troubleshooting.md +++ b/troubleshooting.md @@ -156,7 +156,7 @@ When rootless Podman attempts to execute a container on a non exec home director #### Symptom -If you are running Podman or buildah on a home directory that is mounted noexec, +If you are running Podman or Buildah on a home directory that is mounted noexec, then they will fail. With a message like: ``` @@ -726,3 +726,23 @@ And then re-add the connection (removing the old one if necessary): And now this should work: `podman-remote info` + +--- +### 28) Rootless CNI networking fails in RHEL with Podman v2.2.1 to v3.0.1. + +A failure is encountered when trying to use networking on a rootless +container in Podman v2.2.1 through v3.0.1 on RHEL. This error does not +occur on other Linux Distributions. + +#### Symptom + +A rootless container is created using a CNI network, but the `podman run` command +returns an error that an image must be built. + +#### Solution + +In order to use a CNI network in a rootless container on RHEL, +an Infra container image for CNI-in-slirp4netns must be created. The +instructions for building the Infra container image can be found for +v2.2.1 [here](https://github.com/containers/podman/tree/v2.2.1-rhel/contrib/rootless-cni-infra), +and for v3.0.1 [here](https://github.com/containers/podman/tree/v3.0.1-rhel/contrib/rootless-cni-infra). |