mirror of
https://github.com/containers/podman.git
synced 2025-05-17 23:26:08 +08:00
pod create: add --infra-conmon-pidfile
Add an `--infra-conmon-pidfile` flag to `podman-pod-create` to write the infra container's conmon process ID to a specified path. Several container sub-commands already support `--conmon-pidfile` which is especially helpful to allow for systemd to access and track the conmon processes. This allows for easily tracking the conmon process of a pod's infra container. Signed-off-by: Valentin Rothberg <rothberg@redhat.com>
This commit is contained in:
@ -53,6 +53,7 @@ func init() {
|
||||
flags.AddFlagSet(common.GetNetFlags())
|
||||
flags.StringVar(&createOptions.CGroupParent, "cgroup-parent", "", "Set parent cgroup for the pod")
|
||||
flags.BoolVar(&createOptions.Infra, "infra", true, "Create an infra container associated with the pod to share namespaces with")
|
||||
flags.StringVar(&createOptions.InfraConmonPidFile, "infra-conmon-pidfile", "", "Path to the file that will receive the POD of the infra container's conmon")
|
||||
flags.StringVar(&createOptions.InfraImage, "infra-image", containerConfig.Engine.InfraImage, "The image of the infra container to associate with the pod")
|
||||
flags.StringVar(&createOptions.InfraCommand, "infra-command", containerConfig.Engine.InfraCommand, "The command to run on the infra container when the pod is started")
|
||||
flags.StringSliceVar(&labelFile, "label-file", []string{}, "Read in a line delimited file of labels")
|
||||
@ -83,6 +84,9 @@ func create(cmd *cobra.Command, args []string) error {
|
||||
|
||||
if !createOptions.Infra {
|
||||
logrus.Debugf("Not creating an infra container")
|
||||
if cmd.Flag("infra-conmon-pidfile").Changed {
|
||||
return errors.New("cannot set infra-conmon-pid without an infra container")
|
||||
}
|
||||
if cmd.Flag("infra-command").Changed {
|
||||
return errors.New("cannot set infra-command without an infra container")
|
||||
}
|
||||
|
@ -3098,6 +3098,7 @@ _podman_pod_create() {
|
||||
--dns-opt
|
||||
--dns-search
|
||||
--infra-command
|
||||
--infra-conmon-pidfile
|
||||
--infra-image
|
||||
--ip
|
||||
--label-file
|
||||
|
@ -47,6 +47,10 @@ Set a hostname to the pod
|
||||
|
||||
Create an infra container and associate it with the pod. An infra container is a lightweight container used to coordinate the shared kernel namespace of a pod. Default: true.
|
||||
|
||||
**--infra-conmon-pidfile**=*file*
|
||||
|
||||
Write the pid of the infra container's **conmon** process to a file. As **conmon** runs in a separate process than Podman, this is necessary when using systemd to manage Podman containers and pods.
|
||||
|
||||
**--infra-command**=*command*
|
||||
|
||||
The command that will be run to start the infra container. Default: "/pause".
|
||||
|
@ -1550,6 +1550,18 @@ func WithPodCreateCommand() PodCreateOption {
|
||||
}
|
||||
}
|
||||
|
||||
// WithInfraConmonPidFile sets the path to a custom conmon PID file for the
|
||||
// infra container.
|
||||
func WithInfraConmonPidFile(path string) PodCreateOption {
|
||||
return func(pod *Pod) error {
|
||||
if pod.valid {
|
||||
return define.ErrPodFinalized
|
||||
}
|
||||
pod.config.InfraContainer.ConmonPidFile = path
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// WithPodLabels sets the labels of a pod.
|
||||
func WithPodLabels(labels map[string]string) PodCreateOption {
|
||||
return func(pod *Pod) error {
|
||||
|
@ -83,6 +83,7 @@ type podState struct {
|
||||
|
||||
// InfraContainerConfig is the configuration for the pod's infra container
|
||||
type InfraContainerConfig struct {
|
||||
ConmonPidFile string `json:"conmonPidFile"`
|
||||
HasInfraContainer bool `json:"makeInfraContainer"`
|
||||
HostNetwork bool `json:"infraHostNetwork,omitempty"`
|
||||
PortBindings []ocicni.PortMapping `json:"infraPortBindings"`
|
||||
|
@ -130,6 +130,9 @@ func (r *Runtime) makeInfraContainer(ctx context.Context, p *Pod, imgName, rawIm
|
||||
options = append(options, WithRootFSFromImage(imgID, imgName, rawImageName))
|
||||
options = append(options, WithName(containerName))
|
||||
options = append(options, withIsInfra())
|
||||
if len(p.config.InfraContainer.ConmonPidFile) > 0 {
|
||||
options = append(options, WithConmonPidFile(p.config.InfraContainer.ConmonPidFile))
|
||||
}
|
||||
|
||||
return r.newContainer(ctx, g.Config, options...)
|
||||
}
|
||||
|
@ -108,6 +108,7 @@ type PodCreateOptions struct {
|
||||
Infra bool
|
||||
InfraImage string
|
||||
InfraCommand string
|
||||
InfraConmonPidFile string
|
||||
Labels map[string]string
|
||||
Name string
|
||||
Net *NetOptions
|
||||
@ -127,6 +128,9 @@ func (p PodCreateOptions) ToPodSpecGen(s *specgen.PodSpecGenerator) {
|
||||
if len(p.InfraCommand) > 0 {
|
||||
s.InfraCommand = strings.Split(p.InfraCommand, " ")
|
||||
}
|
||||
if len(p.InfraConmonPidFile) > 0 {
|
||||
s.InfraConmonPidFile = p.InfraConmonPidFile
|
||||
}
|
||||
s.InfraImage = p.InfraImage
|
||||
s.SharedNamespaces = p.Share
|
||||
|
||||
|
@ -94,5 +94,8 @@ func createPodOptions(p *specgen.PodSpecGenerator) ([]libpod.PodCreateOption, er
|
||||
}
|
||||
options = append(options, libpod.WithPodCgroups())
|
||||
options = append(options, libpod.WithPodCreateCommand())
|
||||
if len(p.InfraConmonPidFile) > 0 {
|
||||
options = append(options, libpod.WithInfraConmonPidFile(p.InfraConmonPidFile))
|
||||
}
|
||||
return options, nil
|
||||
}
|
||||
|
@ -25,6 +25,9 @@ type PodBasicConfig struct {
|
||||
// InfraCommand and InfraImages in this struct.
|
||||
// Optional.
|
||||
NoInfra bool `json:"no_infra,omitempty"`
|
||||
// InfraConmonPidFile is a custom path to store the infra container's
|
||||
// conmon PID.
|
||||
InfraConmonPidFile string `json:"infra_conmon_pid_file,omitempty"`
|
||||
// InfraCommand sets the command that will be used to start the infra
|
||||
// container.
|
||||
// If not set, the default set in the Libpod configuration file will be
|
||||
|
@ -193,4 +193,23 @@ var _ = Describe("Podman pod start", func() {
|
||||
Expect(session.ExitCode()).To(Equal(0))
|
||||
Expect(podmanTest.NumberOfContainersRunning()).To(Equal(20)) // 10*(infra+top)
|
||||
})
|
||||
|
||||
It("podman pod create --infra-conmon-pod create + start", func() {
|
||||
tmpDir, err := ioutil.TempDir("", "")
|
||||
Expect(err).To(BeNil())
|
||||
tmpFile := tmpDir + "podID"
|
||||
defer os.RemoveAll(tmpDir)
|
||||
|
||||
podName := "rudolph"
|
||||
// Create a pod with --infra-conmon-pid.
|
||||
session := podmanTest.Podman([]string{"pod", "create", "--name", podName, "--infra-conmon-pidfile", tmpFile})
|
||||
session.WaitWithDefaultTimeout()
|
||||
Expect(session.ExitCode()).To(Equal(0))
|
||||
|
||||
session = podmanTest.Podman([]string{"pod", "start", podName})
|
||||
session.WaitWithDefaultTimeout()
|
||||
Expect(session.ExitCode()).To(Equal(0))
|
||||
Expect(podmanTest.NumberOfContainersRunning()).To(Equal(1)) // infra
|
||||
})
|
||||
|
||||
})
|
||||
|
Reference in New Issue
Block a user