Skip to content

Commit

Permalink
pkg/config: lookup InitPath in HelperBinariesDir
Browse files Browse the repository at this point in the history
Forcing a single upstream default for the init path is bad as some
distro use different install locations for various reasons.

To fix this use the existing helper_binaries_dir field to lookup in all
directories. To keep backwards compatibility we keep using the old
default and both Containers.InitPath and Engine.InitPath. Yes that is
right, somehow we ended up with the same config field under the
containers and engine section and they are both used in podman!
Thus we need to keep supporting both, only the field under the container
section was documented and now recommends the use of helper_binaries_dir.

To make the docs more clear also document what binaries are currently
looked up in helper_binaries_dir.

Note this needs further integration in podman.

Fixes #1110

Signed-off-by: Paul Holzinger <[email protected]>
  • Loading branch information
Luap99 committed Oct 18, 2023
1 parent 2645973 commit 6e0db62
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 6 deletions.
15 changes: 15 additions & 0 deletions docs/containers.conf.5.md
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,10 @@ Run an init inside the container that forwards signals and reaps processes.

**init_path**="/usr/libexec/podman/catatonit"

If this option is not set catatonit is searched in the directories listed under
the **helper_binaries_dir** option. It is recommended to just install catatonit
there instead of configuring this option here.

Path to the container-init binary, which forwards signals and reaps processes
within containers. Note that the container-init binary will only be used when
the `--init` for podman-create and podman-run is set.
Expand Down Expand Up @@ -574,6 +578,17 @@ with detailed information about the container. Set to false by default.
**helper_binaries_dir**=["/usr/libexec/podman", ...]

A is a list of directories which are used to search for helper binaries.
The following binaries are searched in these directories:
- aardvark-dns
- catatonit
- netavark
- pasta
- slirp4netns

Podman machine uses it for these binaries:
- gvproxy
- qemu
- vfkit

The default paths on Linux are:

Expand Down
21 changes: 21 additions & 0 deletions pkg/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,8 @@ type ContainersConfig struct {
Init bool `toml:"init,omitempty"`

// InitPath is the path for init to run if the Init bool is enabled
//
// Deprecated: Do not use this field directly use conf.FindInitBinary() instead.
InitPath string `toml:"init_path,omitempty"`

// IPCNS way to create a ipc namespace for the container
Expand Down Expand Up @@ -351,6 +353,8 @@ type EngineConfig struct {
InfraImage string `toml:"infra_image,omitempty"`

// InitPath is the path to the container-init binary.
//
// Deprecated: Do not use this field directly use conf.FindInitBinary() instead.
InitPath string `toml:"init_path,omitempty"`

// KubeGenerateType sets the Kubernetes kind/specification to generate by default
Expand Down Expand Up @@ -1223,3 +1227,20 @@ func ValidateImageVolumeMode(mode string) error {

return fmt.Errorf("invalid image volume mode %q required value: %s", mode, strings.Join(validImageVolumeModes, ", "))
}

// FindInitBinary will return the path to the init binary (catatonit)
func (c *Config) FindInitBinary() (string, error) {
// Sigh, for some reason we ended up with two InitPath field in containers.conf and
// both are used in podman so we have to keep supporting both to prevent regressions.
if c.Containers.InitPath != "" {
return c.Containers.InitPath, nil
}
if c.Engine.InitPath != "" {
return c.Engine.InitPath, nil
}
// keep old default working to guarantee backwards comapt
if _, err := os.Stat(DefaultInitPath); err == nil {
return DefaultInitPath, nil
}
return c.FindHelperBinary(defaultInitName, true)
}
3 changes: 3 additions & 0 deletions pkg/config/containers.conf
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,9 @@ default_sysctls = [
#init = false

# Container init binary, if init=true, this is the init binary to be used for containers.
# If this option is not set catatonit is searched in the directories listed under
# the helper_binaries_dir option. It is recommended to just install catatonit
# there instead of configuring this option here.
#
#init_path = "/usr/libexec/podman/catatonit"

Expand Down
3 changes: 3 additions & 0 deletions pkg/config/containers.conf-freebsd
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,9 @@ default_sysctls = [
#init = false

# Container init binary, if init=true, this is the init binary to be used for containers.
# If this option is not set catatonit is searched in the directories listed under
# the helper_binaries_dir option. It is recommended to just install catatonit
# there instead of configuring this option here.
#
#init_path = "/usr/local/libexec/podman/catatonit"

Expand Down
9 changes: 3 additions & 6 deletions pkg/config/default.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@ const (

// _defaultImageVolumeMode is a mode to handle built-in image volumes.
_defaultImageVolumeMode = _typeBind

// defaultInitName is the default name of the init binary
defaultInitName = "catatonit"
)

var (
Expand Down Expand Up @@ -432,7 +435,6 @@ func defaultEngineConfig() (*EngineConfig, error) {
}
c.RuntimeSupportsNoCgroups = []string{"crun", "krun"}
c.RuntimeSupportsKVM = []string{"kata", "kata-runtime", "kata-qemu", "kata-fc", "krun"}
c.InitPath = DefaultInitPath
c.NoPivotRoot = false

c.InfraImage = DefaultInfraImage
Expand Down Expand Up @@ -540,11 +542,6 @@ func (c *Config) Env() []string {
return c.Containers.Env
}

// InitPath returns location where init program added to containers when users specify the --init flag.
func (c *Config) InitPath() string {
return c.Containers.InitPath
}

// IPCNS returns the default IPC Namespace configuration to run containers with.
func (c *Config) IPCNS() string {
return c.Containers.IPCNS
Expand Down

0 comments on commit 6e0db62

Please sign in to comment.