mirror of
https://github.com/containers/podman.git
synced 2025-06-24 03:08:13 +08:00
Deduplicate between Volumes and Mounts in compat API
Docker Compose v2.0 passes mount specifications in two different places: Volumes (just the destination) and Mounts (full info provided - source, destination, etc). This was causing Podman to refuse to create containers, as the destination was used twice. Deduplicate between Mounts and Volumes, preferring volumes, to resolve this. Fixes #11822 Signed-off-by: Matthew Heon <mheon@redhat.com>
This commit is contained in:
@ -97,12 +97,21 @@ func ContainerCreateToContainerCLIOpts(cc handlers.CreateContainerConfig, rtc *c
|
|||||||
}
|
}
|
||||||
|
|
||||||
// mounts type=tmpfs/bind,source=...,target=...=,opt=val
|
// mounts type=tmpfs/bind,source=...,target=...=,opt=val
|
||||||
|
volSources := make(map[string]bool)
|
||||||
|
volDestinations := make(map[string]bool)
|
||||||
mounts := make([]string, 0, len(cc.HostConfig.Mounts))
|
mounts := make([]string, 0, len(cc.HostConfig.Mounts))
|
||||||
var builder strings.Builder
|
var builder strings.Builder
|
||||||
for _, m := range cc.HostConfig.Mounts {
|
for _, m := range cc.HostConfig.Mounts {
|
||||||
addField(&builder, "type", string(m.Type))
|
addField(&builder, "type", string(m.Type))
|
||||||
addField(&builder, "source", m.Source)
|
addField(&builder, "source", m.Source)
|
||||||
addField(&builder, "target", m.Target)
|
addField(&builder, "target", m.Target)
|
||||||
|
|
||||||
|
// Store source/dest so we don't add duplicates if a volume is
|
||||||
|
// also mentioned in cc.Volumes.
|
||||||
|
// Which Docker Compose v2.0 does, for unclear reasons...
|
||||||
|
volSources[m.Source] = true
|
||||||
|
volDestinations[m.Target] = true
|
||||||
|
|
||||||
if m.ReadOnly {
|
if m.ReadOnly {
|
||||||
addField(&builder, "ro", "true")
|
addField(&builder, "ro", "true")
|
||||||
}
|
}
|
||||||
@ -328,8 +337,6 @@ func ContainerCreateToContainerCLIOpts(cc handlers.CreateContainerConfig, rtc *c
|
|||||||
}
|
}
|
||||||
|
|
||||||
// volumes
|
// volumes
|
||||||
volSources := make(map[string]bool)
|
|
||||||
volDestinations := make(map[string]bool)
|
|
||||||
for _, vol := range cc.HostConfig.Binds {
|
for _, vol := range cc.HostConfig.Binds {
|
||||||
cliOpts.Volume = append(cliOpts.Volume, vol)
|
cliOpts.Volume = append(cliOpts.Volume, vol)
|
||||||
// Extract the destination so we don't add duplicate mounts in
|
// Extract the destination so we don't add duplicate mounts in
|
||||||
@ -348,6 +355,8 @@ func ContainerCreateToContainerCLIOpts(cc handlers.CreateContainerConfig, rtc *c
|
|||||||
// format of `-v` so we can just append them in there.
|
// format of `-v` so we can just append them in there.
|
||||||
// Unfortunately, these may be duplicates of existing mounts in Binds.
|
// Unfortunately, these may be duplicates of existing mounts in Binds.
|
||||||
// So... We need to catch that.
|
// So... We need to catch that.
|
||||||
|
// This also handles volumes duplicated between cc.HostConfig.Mounts and
|
||||||
|
// cc.Volumes, as seen in compose v2.0.
|
||||||
for vol := range cc.Volumes {
|
for vol := range cc.Volumes {
|
||||||
if _, ok := volDestinations[filepath.Clean(vol)]; ok {
|
if _, ok := volDestinations[filepath.Clean(vol)]; ok {
|
||||||
continue
|
continue
|
||||||
|
Reference in New Issue
Block a user