summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmd/podman/system/reset.go21
-rw-r--r--pkg/domain/entities/engine_container.go1
-rw-r--r--pkg/domain/infra/abi/containers.go4
-rw-r--r--pkg/domain/infra/tunnel/containers.go6
-rw-r--r--pkg/ps/ps.go34
-rw-r--r--troubleshooting.md22
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).