Skip to content

Commit 77d2ae9

Browse files
Merge pull request #18838 from rhatdan/workdir
Add WorkingDir support to quadlet
2 parents e02fa23 + 1609293 commit 77d2ae9

File tree

4 files changed

+39
-19
lines changed

4 files changed

+39
-19
lines changed

docs/source/markdown/podman-systemd.unit.5.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ Valid options for `[Container]` are listed below:
137137
| UserNS=keep-id:uid=200,gid=210 | --userns keep-id:uid=200,gid=210 |
138138
| VolatileTmp=true | --tmpfs /tmp |
139139
| Volume=/source:/dest | --volume /source:/dest |
140+
| WorkingDir=$HOME | --workdir $HOME |
140141

141142
Description of `[Container]` section are:
142143

@@ -491,6 +492,12 @@ created by using a `$name.volume` Quadlet file.
491492

492493
This key can be listed multiple times.
493494

495+
### `WorkingDir=`
496+
497+
Working directory inside the container.
498+
499+
The default working directory for running binaries within a container is the root directory (/). The image developer can set a different default with the WORKDIR instruction. This option overrides the working directory by using the -w option.
500+
494501
## Kube units [Kube]
495502

496503
Kube units are named with a `.kube` extension and contain a `[Kube]` section describing

pkg/systemd/quadlet/quadlet.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ const (
104104
KeyUserNS = "UserNS"
105105
KeyVolatileTmp = "VolatileTmp"
106106
KeyVolume = "Volume"
107+
KeyWorkingDir = "WorkingDir"
107108
KeyYaml = "Yaml"
108109
)
109110

@@ -168,6 +169,7 @@ var (
168169
KeyUserNS: true,
169170
KeyVolatileTmp: true,
170171
KeyVolume: true,
172+
KeyWorkingDir: true,
171173
}
172174

173175
// Supported keys in "Volume" group
@@ -504,6 +506,10 @@ func ConvertContainer(container *parser.UnitFile, isUser bool) (*parser.UnitFile
504506
}
505507
}
506508

509+
if workdir, exists := container.Lookup(ContainerGroup, KeyWorkingDir); exists {
510+
podman.addf("-w=%s", workdir)
511+
}
512+
507513
if err := handleUserRemap(container, ContainerGroup, podman, isUser, true); err != nil {
508514
return nil, err
509515
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
## assert-podman-final-args localhost/imagename
2+
## assert-podman-args "-w=%h"
3+
4+
[Container]
5+
Image=localhost/imagename
6+
WorkingDir=%h

test/e2e/quadlet_test.go

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -536,51 +536,52 @@ var _ = Describe("quadlet system generator", func() {
536536
Entry("basepodman.container", "basepodman.container"),
537537
Entry("capabilities.container", "capabilities.container"),
538538
Entry("capabilities2.container", "capabilities2.container"),
539-
Entry("disableselinux.container", "disableselinux.container"),
540-
Entry("nestedselinux.container", "nestedselinux.container"),
541539
Entry("devices.container", "devices.container"),
540+
Entry("disableselinux.container", "disableselinux.container"),
541+
Entry("env-file.container", "env-file.container"),
542+
Entry("env-host-false.container", "env-host-false.container"),
543+
Entry("env-host.container", "env-host.container"),
542544
Entry("env.container", "env.container"),
543545
Entry("escapes.container", "escapes.container"),
544546
Entry("exec.container", "exec.container"),
547+
Entry("health.container", "health.container"),
548+
Entry("hostname.container", "hostname.container"),
545549
Entry("image.container", "image.container"),
546550
Entry("install.container", "install.container"),
547551
Entry("ip.container", "ip.container"),
548552
Entry("label.container", "label.container"),
553+
Entry("logdriver.container", "logdriver.container"),
554+
Entry("mount.container", "mount.container"),
549555
Entry("name.container", "name.container"),
556+
Entry("nestedselinux.container", "nestedselinux.container"),
550557
Entry("network.container", "network.container"),
551558
Entry("network.quadlet.container", "network.quadlet.container"),
552559
Entry("noimage.container", "noimage.container"),
553560
Entry("notify.container", "notify.container"),
554561
Entry("oneshot.container", "oneshot.container"),
555-
Entry("rootfs.container", "rootfs.container"),
556-
Entry("selinux.container", "selinux.container"),
557562
Entry("other-sections.container", "other-sections.container"),
558563
Entry("podmanargs.container", "podmanargs.container"),
559564
Entry("ports.container", "ports.container"),
560565
Entry("ports_ipv6.container", "ports_ipv6.container"),
566+
Entry("pull.container", "pull.container"),
561567
Entry("readonly-notmpfs.container", "readonly-notmpfs.container"),
562-
Entry("readwrite.container", "readwrite.container"),
563568
Entry("readwrite-notmpfs.container", "readwrite-notmpfs.container"),
569+
Entry("readwrite.container", "readwrite.container"),
570+
Entry("remap-auto.container", "remap-auto.container"),
571+
Entry("remap-auto2.container", "remap-auto2.container"),
572+
Entry("remap-keep-id.container", "remap-keep-id.container"),
573+
Entry("remap-keep-id2.container", "remap-keep-id2.container"),
574+
Entry("remap-manual.container", "remap-manual.container"),
575+
Entry("rootfs.container", "rootfs.container"),
564576
Entry("seccomp.container", "seccomp.container"),
577+
Entry("secrets.container", "secrets.container"),
578+
Entry("selinux.container", "selinux.container"),
565579
Entry("shortname.container", "shortname.container"),
566580
Entry("sysctl.container", "sysctl.container"),
567581
Entry("timezone.container", "timezone.container"),
568582
Entry("user.container", "user.container"),
569-
Entry("remap-manual.container", "remap-manual.container"),
570-
Entry("remap-auto.container", "remap-auto.container"),
571-
Entry("remap-auto2.container", "remap-auto2.container"),
572-
Entry("remap-keep-id.container", "remap-keep-id.container"),
573-
Entry("remap-keep-id2.container", "remap-keep-id2.container"),
574583
Entry("volume.container", "volume.container"),
575-
Entry("env-file.container", "env-file.container"),
576-
Entry("env-host.container", "env-host.container"),
577-
Entry("env-host-false.container", "env-host-false.container"),
578-
Entry("secrets.container", "secrets.container"),
579-
Entry("logdriver.container", "logdriver.container"),
580-
Entry("mount.container", "mount.container"),
581-
Entry("health.container", "health.container"),
582-
Entry("hostname.container", "hostname.container"),
583-
Entry("pull.container", "pull.container"),
584+
Entry("workingdir.container", "workingdir.container"),
584585

585586
Entry("basic.volume", "basic.volume"),
586587
Entry("label.volume", "label.volume"),

0 commit comments

Comments
 (0)