Skip to content

Commit 22d4ec1

Browse files
committed
Add ulimits to
1 parent f235d47 commit 22d4ec1

File tree

13 files changed

+160
-13
lines changed

13 files changed

+160
-13
lines changed

cmd/podman/common/create.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -440,14 +440,6 @@ func DefineCreateFlags(cmd *cobra.Command, cf *entities.ContainerCreateOptions,
440440
)
441441
_ = cmd.RegisterFlagCompletionFunc(umaskFlagName, completion.AutocompleteNone)
442442

443-
ulimitFlagName := "ulimit"
444-
createFlags.StringSliceVar(
445-
&cf.Ulimit,
446-
ulimitFlagName, cf.Ulimit,
447-
"Ulimit options",
448-
)
449-
_ = cmd.RegisterFlagCompletionFunc(ulimitFlagName, completion.AutocompleteNone)
450-
451443
userFlagName := "user"
452444
createFlags.StringVarP(
453445
&cf.User,
@@ -559,6 +551,14 @@ func DefineCreateFlags(cmd *cobra.Command, cf *entities.ContainerCreateOptions,
559551
)
560552
_ = cmd.RegisterFlagCompletionFunc(unsetenvFlagName, completion.AutocompleteNone)
561553

554+
ulimitFlagName := "ulimit"
555+
createFlags.StringSliceVar(
556+
&cf.Ulimit,
557+
ulimitFlagName, cf.Ulimit,
558+
"Ulimit options",
559+
)
560+
_ = cmd.RegisterFlagCompletionFunc(ulimitFlagName, completion.AutocompleteNone)
561+
562562
healthCmdFlagName := "health-cmd"
563563
createFlags.StringVar(
564564
&cf.HealthCmd,

cmd/podman/containers/update.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,18 @@ func update(cmd *cobra.Command, args []string) error {
179179
opts.UnsetEnv = env
180180
}
181181

182+
if cmd.Flags().Changed("ulimit") {
183+
ulimits, err := cmd.Flags().GetStringArray("ulimit")
184+
if err != nil {
185+
return err
186+
}
187+
rlimits, err := specgenutil.GenRlimits(ulimits)
188+
if err != nil {
189+
return err
190+
}
191+
opts.Rlimits = rlimits
192+
}
193+
182194
rep, err := registry.ContainerEngine().ContainerUpdate(context.Background(), opts)
183195
if err != nil {
184196
return err

docs/source/markdown/options/ulimit.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
####> This option file is used in:
2-
####> podman create, run
2+
####> podman create, run, update
33
####> If file is edited, make sure the changes
44
####> are applicable to all of those.
55
#### **--ulimit**=*option*

docs/source/markdown/podman-update.1.md.in

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,8 @@ Changing this setting resets the timer, depending on the state of the container.
9292

9393
@@option restart
9494

95+
@@option ulimit
96+
9597
@@option unsetenv.update
9698

9799

@@ -102,6 +104,11 @@ Update a container with a new cpu quota and period:
102104
podman update --cpus=0.5 ctrID
103105
```
104106

107+
Update a container's ulimit:
108+
```
109+
podman update --ulimit nofile=1024:1024 myCtr
110+
```
111+
105112
Update a container with multiple options at ones:
106113
```
107114
podman update --cpus 5 --cpuset-cpus 0 --cpu-shares 123 --cpuset-mems 0 \\

libpod/container_internal.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2810,6 +2810,7 @@ func (c *Container) update(updateOptions *entities.ContainerUpdateOptions) error
28102810
}
28112811
oldRestart := c.config.RestartPolicy
28122812
oldRetries := c.config.RestartRetries
2813+
oldRlimits := c.config.Spec.Process.Rlimits
28132814

28142815
if updateOptions.RestartPolicy != nil {
28152816
if err := define.ValidateRestartPolicy(*updateOptions.RestartPolicy); err != nil {
@@ -2857,16 +2858,21 @@ func (c *Container) update(updateOptions *entities.ContainerUpdateOptions) error
28572858
c.config.Spec.Process.Env = envLib.Slice(envMap)
28582859
}
28592860

2861+
if updateOptions.Rlimits != nil {
2862+
c.config.Spec.Process.Rlimits = updateOptions.Rlimits
2863+
}
2864+
28602865
if err := c.runtime.state.SafeRewriteContainerConfig(c, "", "", c.config); err != nil {
28612866
// Assume DB write failed, revert to old resources block
28622867
c.config.Spec.Linux.Resources = oldResources
28632868
c.config.RestartPolicy = oldRestart
28642869
c.config.RestartRetries = oldRetries
2870+
c.config.Spec.Process.Rlimits = oldRlimits
28652871
return err
28662872
}
28672873

28682874
if c.ensureState(define.ContainerStateCreated, define.ContainerStateRunning, define.ContainerStatePaused) &&
2869-
(updateOptions.Resources != nil || updateOptions.Env != nil || updateOptions.UnsetEnv != nil) {
2875+
(updateOptions.Resources != nil || updateOptions.Env != nil || updateOptions.UnsetEnv != nil || updateOptions.Rlimits != nil) {
28702876
// So `podman inspect` on running containers sources its OCI spec from disk.
28712877
// To keep inspect accurate we need to update the on-disk OCI spec.
28722878
onDiskSpec, err := c.specFromState()
@@ -2882,6 +2888,9 @@ func (c *Container) update(updateOptions *entities.ContainerUpdateOptions) error
28822888
if len(updateOptions.Env) != 0 || len(updateOptions.UnsetEnv) != 0 {
28832889
onDiskSpec.Process.Env = c.config.Spec.Process.Env
28842890
}
2891+
if updateOptions.Rlimits != nil {
2892+
onDiskSpec.Process.Rlimits = updateOptions.Rlimits
2893+
}
28852894
if err := c.saveSpec(onDiskSpec); err != nil {
28862895
logrus.Errorf("Unable to update container %s OCI spec - `podman inspect` may not be accurate until container is restarted: %v", c.ID(), err)
28872896
}

pkg/api/handlers/compat/containers.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -822,11 +822,25 @@ func UpdateContainer(w http.ResponseWriter, r *http.Request) {
822822
restartRetries = &localRetries
823823
}
824824

825+
// Rlimits
826+
var rlimits []spec.POSIXRlimit
827+
if len(options.Ulimits) > 0 {
828+
for _, ulimit := range options.Ulimits {
829+
rlimit := spec.POSIXRlimit{
830+
Type: ulimit.Name,
831+
Hard: uint64(ulimit.Hard),
832+
Soft: uint64(ulimit.Soft),
833+
}
834+
rlimits = append(rlimits, rlimit)
835+
}
836+
}
837+
825838
updateOptions := &entities.ContainerUpdateOptions{
826839
Resources: resources,
827840
ChangedHealthCheckConfiguration: &define.UpdateHealthCheckConfig{},
828841
RestartPolicy: restartPolicy,
829842
RestartRetries: restartRetries,
843+
Rlimits: rlimits,
830844
}
831845

832846
if err := ctr.Update(updateOptions); err != nil {

pkg/api/handlers/libpod/containers.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -462,6 +462,7 @@ func UpdateContainer(w http.ResponseWriter, r *http.Request) {
462462
RestartRetries: restartRetries,
463463
Env: options.Env,
464464
UnsetEnv: options.UnsetEnv,
465+
Rlimits: options.Rlimits,
465466
}
466467

467468
err = ctr.Update(updateOptions)

pkg/api/handlers/types.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ type UpdateEntities struct {
8181
define.UpdateContainerDevicesLimits
8282
Env []string
8383
UnsetEnv []string
84+
Rlimits []specs.POSIXRlimit
8485
}
8586

8687
type Info struct {

pkg/bindings/containers/update.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ func Update(ctx context.Context, options *types.ContainerUpdateOptions) (string,
4040
if options.DevicesLimits != nil {
4141
updateEntities.UpdateContainerDevicesLimits = *options.DevicesLimits
4242
}
43+
if options.Rlimits != nil {
44+
updateEntities.Rlimits = options.Rlimits
45+
}
4346

4447
requestData, err := jsoniter.MarshalToString(updateEntities)
4548
if err != nil {

pkg/domain/entities/types/containers.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ type ContainerUpdateOptions struct {
5353
// - RestartRetries to change restart retries
5454
// - Env to change the environment variables.
5555
// - UntsetEnv to unset the environment variables.
56+
// - Rlimits to change POSIX resource limits.
5657
Specgen *specgen.SpecGenerator
5758
Resources *specs.LinuxResources
5859
DevicesLimits *define.UpdateContainerDevicesLimits
@@ -61,6 +62,7 @@ type ContainerUpdateOptions struct {
6162
RestartRetries *uint
6263
Env []string
6364
UnsetEnv []string
65+
Rlimits []specs.POSIXRlimit
6466
}
6567

6668
func (u *ContainerUpdateOptions) ProcessSpecgen() {
@@ -87,4 +89,8 @@ func (u *ContainerUpdateOptions) ProcessSpecgen() {
8789
if u.RestartRetries == nil {
8890
u.RestartRetries = u.Specgen.RestartRetries
8991
}
92+
93+
if u.Rlimits == nil {
94+
u.Rlimits = u.Specgen.Rlimits
95+
}
9096
}

0 commit comments

Comments
 (0)