From 3aaf61e9806ff45326fbcd7d71e98536785f7110 Mon Sep 17 00:00:00 2001 From: turtletowerz Date: Sun, 27 Oct 2024 14:10:38 -0400 Subject: [PATCH] add --init and --entrypoint --- README.md | 3 --- main.go | 9 +++++++-- parse.go | 47 ++++++++++++++++++++++++++++++++--------------- 3 files changed, 39 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 4731c4e..dadcafb 100644 --- a/README.md +++ b/README.md @@ -14,11 +14,8 @@ done in a separate Github Action. ### Current Unsupported Flags -- `--entrypoint` - `--gpus` -- `--init` - `--mount` -- `--tmpfs` - `--ip` - `--ip6` - `--network-alias` diff --git a/main.go b/main.go index e8ea049..265d31e 100644 --- a/main.go +++ b/main.go @@ -41,18 +41,22 @@ func parseFromJSON(cli *client.Client, ct *types.ContainerJSON) ([]string, error optSlice[string]{ct.HostConfig.Binds, nil, "-v "}, optSlice[string]{ct.HostConfig.VolumesFrom, nil, "--volumes-from="}, opt[string]{ct.HostConfig.VolumeDriver, "", "--volume-driver="}, + optFunc[map[string]string]{ct.HostConfig.Tmpfs, handleTmpFS}, // Misc popular options opt[string]{ct.Config.WorkingDir, imgdata.Config.WorkingDir, "--workdir="}, opt[string]{ct.HostConfig.LogConfig.Type, "json-file", "--log-driver="}, optMap{ct.HostConfig.LogConfig.Config, "--log-opt "}, - optFunc[*labels]{&labels{ct.Config.Labels, imgdata.Config.Labels}, handleLabels}, - optFunc[*capabilities]{&capabilities{ct.HostConfig.CapAdd, ct.HostConfig.CapDrop}, handleCapabilities}, + optFunc[twoOf[map[string]string]]{twoOf[map[string]string]{ct.Config.Labels, imgdata.Config.Labels, "--label="}, handleLabels}, + optFunc[twoOf[[]string]]{twoOf[[]string]{ct.HostConfig.CapAdd, ct.HostConfig.CapDrop, ""}, handleCapabilities}, opt[bool]{ct.HostConfig.ReadonlyRootfs, false, "--read-only"}, optSlice[string]{ct.HostConfig.SecurityOpt, nil, "--security-opt="}, optMap{ct.HostConfig.StorageOpt, "--storage-opt "}, optMap{ct.HostConfig.Sysctls, "--sysctl "}, + // Commands + optFunc[twoOf[[]string]]{twoOf[[]string]{ct.Config.Entrypoint, imgdata.Config.Entrypoint, "--entrypoint="}, handleCommand}, + // Networking stuff // TODO: Put hostname, MAC address and other network settings behind an optional network flag? optFunc[*types.ContainerJSON]{ct, handlePorts}, @@ -115,6 +119,7 @@ func parseFromJSON(cli *client.Client, ct *types.ContainerJSON) ([]string, error optPtr[int64]{ct.HostConfig.PidsLimit, -1, "--pids-limit="}, optSlice[string]{ct.HostConfig.GroupAdd, nil, "--group-add "}, optSlice[*container.Ulimit]{ct.HostConfig.Ulimits, nil, "--ulimit "}, + optPtr[bool]{ct.HostConfig.Init, false, "--init"}, opt[uint16]{ct.HostConfig.BlkioWeight, 0, "--blkio-weight="}, optSlice[*blkiodev.WeightDevice]{ct.HostConfig.BlkioWeightDevice, nil, "--blkio-weight-device="}, diff --git a/parse.go b/parse.go index f21a2aa..3f0a025 100644 --- a/parse.go +++ b/parse.go @@ -96,21 +96,22 @@ func (o optFunc[T]) Values() []string { return o.f(o.v) } -type capabilities struct { - add []string - drop []string +type twoOf[T any] struct { + first T + second T + name string } -func handleCapabilities(cap *capabilities) (ret []string) { +func handleCapabilities(cap twoOf[[]string]) (ret []string) { defaults := caps.DefaultCapabilities() - for _, c := range cap.add { + for _, c := range cap.first { if !slices.Contains(defaults, "CAP_"+c) { ret = append(ret, "--cap-add=CAP_"+c) } } - for _, c := range cap.drop { + for _, c := range cap.second { if slices.Contains(defaults, "CAP_"+c) { ret = append(ret, "--cap-drop=CAP_"+c) } @@ -170,15 +171,10 @@ func handleDevices(devices []container.DeviceMapping) (ret []string) { return } -type labels struct { - ctlabels map[string]string - imglabels map[string]string -} - -func handleLabels(l *labels) (ret []string) { - for k, v := range l.ctlabels { - if iv, ok := l.imglabels[k]; !ok || v != iv { - ret = append(ret, "--label='"+k+"="+v+"'") +func handleLabels(l twoOf[map[string]string]) (ret []string) { + for k, v := range l.first { + if iv, ok := l.second[k]; !ok || v != iv { + ret = append(ret, l.name+"'"+k+"="+v+"'") } } return @@ -251,3 +247,24 @@ func handlePorts(ctdata *types.ContainerJSON) (ret []string) { return } + +// https://github.com/moby/moby/blob/27.x/integration/internal/container/ops.go#L138 +func handleTmpFS(tmpfs map[string]string) (ret []string) { + for k, v := range tmpfs { + ret = append(ret, "--tmpfs="+k+":"+v) + } + return +} + +func handleCommand(cmds twoOf[[]string]) []string { + if len(cmds.first) == 0 { + return nil + } + + if slices.Compare(cmds.first, cmds.second) == 0 { + return nil + } + + // TODO: Escape quotes + return []string{cmds.name + strconv.Quote(strings.Join(cmds.first, " "))} +}