mirror of
https://github.com/containers/podman.git
synced 2025-06-26 04:46:57 +08:00
Merge pull request #12137 from vrothberg/fix-11735
pod/container create: resolve conflicts of generated names
This commit is contained in:
@ -496,9 +496,27 @@ func (c *Container) setupStorage(ctx context.Context) error {
|
|||||||
|
|
||||||
c.setupStorageMapping(&options.IDMappingOptions, &c.config.IDMappings)
|
c.setupStorageMapping(&options.IDMappingOptions, &c.config.IDMappings)
|
||||||
|
|
||||||
containerInfo, err := c.runtime.storageService.CreateContainerStorage(ctx, c.runtime.imageContext, c.config.RootfsImageName, c.config.RootfsImageID, c.config.Name, c.config.ID, options)
|
// Unless the user has specified a name, use a randomly generated one.
|
||||||
if err != nil {
|
// Note that name conflicts may occur (see #11735), so we need to loop.
|
||||||
return errors.Wrapf(err, "error creating container storage")
|
generateName := c.config.Name == ""
|
||||||
|
var containerInfo ContainerInfo
|
||||||
|
var containerInfoErr error
|
||||||
|
for {
|
||||||
|
if generateName {
|
||||||
|
name, err := c.runtime.generateName()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
c.config.Name = name
|
||||||
|
}
|
||||||
|
containerInfo, containerInfoErr = c.runtime.storageService.CreateContainerStorage(ctx, c.runtime.imageContext, c.config.RootfsImageName, c.config.RootfsImageID, c.config.Name, c.config.ID, options)
|
||||||
|
|
||||||
|
if !generateName || errors.Cause(containerInfoErr) != storage.ErrDuplicateName {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if containerInfoErr != nil {
|
||||||
|
return errors.Wrapf(containerInfoErr, "error creating container storage")
|
||||||
}
|
}
|
||||||
|
|
||||||
// only reconfig IDMappings if layer was mounted from storage
|
// only reconfig IDMappings if layer was mounted from storage
|
||||||
|
@ -326,15 +326,6 @@ func (r *Runtime) setupContainer(ctx context.Context, ctr *Container) (_ *Contai
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ctr.config.Name == "" {
|
|
||||||
name, err := r.generateName()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
ctr.config.Name = name
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check CGroup parent sanity, and set it if it was not set.
|
// Check CGroup parent sanity, and set it if it was not set.
|
||||||
// Only if we're actually configuring CGroups.
|
// Only if we're actually configuring CGroups.
|
||||||
if !ctr.config.NoCgroups {
|
if !ctr.config.NoCgroups {
|
||||||
|
@ -43,18 +43,6 @@ func (r *Runtime) NewPod(ctx context.Context, p specgen.PodSpecGenerator, option
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if pod.config.Name == "" {
|
|
||||||
name, err := r.generateName()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
pod.config.Name = name
|
|
||||||
}
|
|
||||||
|
|
||||||
if p.InfraContainerSpec != nil && p.InfraContainerSpec.Hostname == "" {
|
|
||||||
p.InfraContainerSpec.Hostname = pod.config.Name
|
|
||||||
}
|
|
||||||
|
|
||||||
// Allocate a lock for the pod
|
// Allocate a lock for the pod
|
||||||
lock, err := r.lockManager.AllocateLock()
|
lock, err := r.lockManager.AllocateLock()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -131,9 +119,33 @@ func (r *Runtime) NewPod(ctx context.Context, p specgen.PodSpecGenerator, option
|
|||||||
logrus.Infof("Pod has an infra container, but shares no namespaces")
|
logrus.Infof("Pod has an infra container, but shares no namespaces")
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := r.state.AddPod(pod); err != nil {
|
// Unless the user has specified a name, use a randomly generated one.
|
||||||
return nil, errors.Wrapf(err, "error adding pod to state")
|
// Note that name conflicts may occur (see #11735), so we need to loop.
|
||||||
|
generateName := pod.config.Name == ""
|
||||||
|
var addPodErr error
|
||||||
|
for {
|
||||||
|
if generateName {
|
||||||
|
name, err := r.generateName()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
pod.config.Name = name
|
||||||
|
}
|
||||||
|
|
||||||
|
if p.InfraContainerSpec != nil && p.InfraContainerSpec.Hostname == "" {
|
||||||
|
p.InfraContainerSpec.Hostname = pod.config.Name
|
||||||
|
}
|
||||||
|
if addPodErr = r.state.AddPod(pod); addPodErr == nil {
|
||||||
|
return pod, nil
|
||||||
|
}
|
||||||
|
if !generateName || (errors.Cause(addPodErr) != define.ErrPodExists && errors.Cause(addPodErr) != define.ErrCtrExists) {
|
||||||
|
break
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
if addPodErr != nil {
|
||||||
|
return nil, errors.Wrapf(addPodErr, "error adding pod to state")
|
||||||
|
}
|
||||||
|
|
||||||
return pod, nil
|
return pod, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user