@@ -370,7 +370,9 @@ def default_network_name_for_project(compose: PodmanCompose, net: str, is_ext: A
370370
371371 assert compose .project_name is not None
372372
373- default_net_name_compat = compose .x_podman .get ("default_net_name_compat" , False )
373+ default_net_name_compat = compose .x_podman .get (
374+ PodmanCompose .XPodmanSettingKey .DEFAULT_NET_NAME_COMPAT , False
375+ )
374376 if default_net_name_compat is True :
375377 return f"{ compose .project_name .replace ('-' , '' )} _{ net } "
376378 return f"{ compose .project_name } _{ net } "
@@ -1968,6 +1970,12 @@ def dotenv_to_dict(dotenv_path: str) -> dict[str, str | None]:
19681970
19691971
19701972class PodmanCompose :
1973+ class XPodmanSettingKey (Enum ):
1974+ DEFAULT_NET_NAME_COMPAT = "default_net_name_compat"
1975+ DEFAULT_NET_BEHAVIOR_COMPAT = "default_net_behavior_compat"
1976+ IN_POD = "in_pod"
1977+ POD_ARGS = "pod_args"
1978+
19711979 def __init__ (self ) -> None :
19721980 self .podman : Podman
19731981 self .podman_version : str | None = None
@@ -1988,7 +1996,7 @@ def __init__(self) -> None:
19881996 self .services : dict [str , Any ]
19891997 self .all_services : set [Any ] = set ()
19901998 self .prefer_volume_over_mount = True
1991- self .x_podman : dict [str , Any ] = {}
1999+ self .x_podman : dict [PodmanCompose . XPodmanSettingKey , Any ] = {}
19922000 self .merged_yaml : Any
19932001 self .yaml_hash = ""
19942002 self .console_colors = [
@@ -2059,7 +2067,7 @@ async def run(self, argv: list[str] | None = None) -> None:
20592067
20602068 def resolve_in_pod (self ) -> bool :
20612069 if self .global_args .in_pod in (None , '' ):
2062- self .global_args .in_pod = self .x_podman .get ("in_pod" , "1" )
2070+ self .global_args .in_pod = self .x_podman .get (PodmanCompose . XPodmanSettingKey . IN_POD , "1" )
20632071 # otherwise use `in_pod` value provided by command line
20642072 return self .global_args .in_pod
20652073
@@ -2070,7 +2078,43 @@ def resolve_pod_args(self) -> list[str]:
20702078 # - Default value
20712079 if self .global_args .pod_args is not None :
20722080 return shlex .split (self .global_args .pod_args )
2073- return self .x_podman .get ("pod_args" , ["--infra=false" , "--share=" ])
2081+ return self .x_podman .get (
2082+ PodmanCompose .XPodmanSettingKey .POD_ARGS , ["--infra=false" , "--share=" ]
2083+ )
2084+
2085+ def _parse_x_podman_settings (self , compose : dict [str , Any ], environ : dict [str , str ]) -> None :
2086+ known_keys = {s .value : s for s in PodmanCompose .XPodmanSettingKey }
2087+
2088+ self .x_podman = {}
2089+
2090+ for k , v in compose .get ("x-podman" , {}).items ():
2091+ known_key = known_keys .get (k )
2092+ if known_key :
2093+ self .x_podman [known_key ] = v
2094+ else :
2095+ log .warning (
2096+ "unknown x-podman key [%s] in compose file, supported keys: %s" ,
2097+ k ,
2098+ ", " .join (known_keys .keys ()),
2099+ )
2100+
2101+ env = {
2102+ key .removeprefix ("PODMAN_COMPOSE_" ).lower (): value
2103+ for key , value in environ .items ()
2104+ if key .startswith ("PODMAN_COMPOSE_" )
2105+ and key not in {"PODMAN_COMPOSE_PROVIDER" , "PODMAN_COMPOSE_WARNING_LOGS" }
2106+ }
2107+
2108+ for k , v in env .items ():
2109+ known_key = known_keys .get (k )
2110+ if known_key :
2111+ self .x_podman [known_key ] = v
2112+ else :
2113+ log .warning (
2114+ "unknown PODMAN_COMPOSE_ key [%s] in environment, supported keys: %s" ,
2115+ k ,
2116+ ", " .join (known_keys .keys ()),
2117+ )
20742118
20752119 def _parse_compose_file (self ) -> None :
20762120 args = self .global_args
@@ -2219,6 +2263,8 @@ def _parse_compose_file(self) -> None:
22192263 log .debug (" ** merged:\n %s" , json .dumps (compose , indent = 2 ))
22202264 # ver = compose.get('version')
22212265
2266+ self ._parse_x_podman_settings (compose , self .environ )
2267+
22222268 services : dict | None = compose .get ("services" )
22232269 if services is None :
22242270 services = {}
@@ -2236,7 +2282,7 @@ def _parse_compose_file(self) -> None:
22362282 nets ["default" ] = None
22372283
22382284 self .networks = nets
2239- if compose . get ( "x-podman" , {}) .get ("default_net_behavior_compat" , False ):
2285+ if self . x_podman .get (PodmanCompose . XPodmanSettingKey . DEFAULT_NET_BEHAVIOR_COMPAT , False ):
22402286 # If there is no network_mode and networks in service,
22412287 # docker-compose will create default network named '<project_name>_default'
22422288 # and add the service to the default network.
@@ -2353,8 +2399,6 @@ def _parse_compose_file(self) -> None:
23532399 given_containers .sort (key = lambda c : len (c .get ("_deps" , [])))
23542400 # log("sorted:", [c["name"] for c in given_containers])
23552401
2356- self .x_podman = compose .get ("x-podman" , {})
2357-
23582402 args .in_pod = self .resolve_in_pod ()
23592403 args .pod_arg_list = self .resolve_pod_args ()
23602404 pods , containers = transform (args , project_name , given_containers )
0 commit comments