mirror of
https://github.com/containers/podman-compose.git
synced 2025-04-21 07:59:15 +02:00
Merge pull request #1165 from drachenfels-de/fix-project-name-interpolation
Fix `COMPOSE_PROJECT_NAME` interpolation
This commit is contained in:
commit
7d7533772b
1
newsfragments/1165-PROJECT_NAME-interpolation.bugfix
Normal file
1
newsfragments/1165-PROJECT_NAME-interpolation.bugfix
Normal file
@ -0,0 +1 @@
|
|||||||
|
- Fixed interpolation of the environment variable **COMPOSE_PROJECT_NAME** when it is set from the top-level **name** value within the Compose file.
|
1
newsfragments/1165-project-name-evaluation-order.bugfix
Normal file
1
newsfragments/1165-project-name-evaluation-order.bugfix
Normal file
@ -0,0 +1 @@
|
|||||||
|
- Fixed project name evaluation order to match the order defined in the [compose spec](https://docs.docker.com/compose/how-tos/project-name/#set-a-project-name).
|
@ -1980,6 +1980,25 @@ class PodmanCompose:
|
|||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
content = normalize(content)
|
content = normalize(content)
|
||||||
# log(filename, json.dumps(content, indent = 2))
|
# log(filename, json.dumps(content, indent = 2))
|
||||||
|
|
||||||
|
# See also https://docs.docker.com/compose/how-tos/project-name/#set-a-project-name
|
||||||
|
# **project_name** is initialized to the argument of the `-p` command line flag.
|
||||||
|
if not project_name:
|
||||||
|
project_name = self.environ.get("COMPOSE_PROJECT_NAME")
|
||||||
|
if not project_name:
|
||||||
|
project_name = content.get("name")
|
||||||
|
if not project_name:
|
||||||
|
project_name = dir_basename.lower()
|
||||||
|
# More strict then actually needed for simplicity:
|
||||||
|
# podman requires [a-zA-Z0-9][a-zA-Z0-9_.-]*
|
||||||
|
project_name_normalized = norm_re.sub("", project_name)
|
||||||
|
if not project_name_normalized:
|
||||||
|
raise RuntimeError(f"Project name [{project_name}] normalized to empty")
|
||||||
|
project_name = project_name_normalized
|
||||||
|
|
||||||
|
self.project_name = project_name
|
||||||
|
self.environ.update({"COMPOSE_PROJECT_NAME": self.project_name})
|
||||||
|
|
||||||
content = rec_subs(content, self.environ)
|
content = rec_subs(content, self.environ)
|
||||||
if isinstance(services := content.get('services'), dict):
|
if isinstance(services := content.get('services'), dict):
|
||||||
for service in services.values():
|
for service in services.values():
|
||||||
@ -2012,19 +2031,6 @@ class PodmanCompose:
|
|||||||
log.debug(" ** merged:\n%s", json.dumps(compose, indent=2))
|
log.debug(" ** merged:\n%s", json.dumps(compose, indent=2))
|
||||||
# ver = compose.get('version')
|
# ver = compose.get('version')
|
||||||
|
|
||||||
if not project_name:
|
|
||||||
project_name = compose.get("name")
|
|
||||||
if project_name is None:
|
|
||||||
# More strict then actually needed for simplicity:
|
|
||||||
# podman requires [a-zA-Z0-9][a-zA-Z0-9_.-]*
|
|
||||||
project_name = self.environ.get("COMPOSE_PROJECT_NAME", dir_basename.lower())
|
|
||||||
project_name = norm_re.sub("", project_name)
|
|
||||||
if not project_name:
|
|
||||||
raise RuntimeError(f"Project name [{dir_basename}] normalized to empty")
|
|
||||||
|
|
||||||
self.project_name = project_name
|
|
||||||
self.environ.update({"COMPOSE_PROJECT_NAME": self.project_name})
|
|
||||||
|
|
||||||
services = compose.get("services")
|
services = compose.get("services")
|
||||||
if services is None:
|
if services is None:
|
||||||
services = {}
|
services = {}
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
version: "3"
|
version: "3"
|
||||||
|
|
||||||
|
name: my-project-name
|
||||||
|
|
||||||
services:
|
services:
|
||||||
env-test:
|
env-test:
|
||||||
image: busybox
|
image: busybox
|
||||||
@ -8,3 +10,9 @@ services:
|
|||||||
ZZVAR1: myval1
|
ZZVAR1: myval1
|
||||||
ZZVAR2: 2-$ZZVAR1
|
ZZVAR2: 2-$ZZVAR1
|
||||||
ZZVAR3: 3-$ZZVAR2
|
ZZVAR3: 3-$ZZVAR2
|
||||||
|
|
||||||
|
project-name-test:
|
||||||
|
image: busybox
|
||||||
|
command: sh -c "echo $$PNAME"
|
||||||
|
environment:
|
||||||
|
PNAME: ${COMPOSE_PROJECT_NAME}
|
||||||
|
@ -36,3 +36,54 @@ class TestComposeEnv(unittest.TestCase, RunSubprocessMixin):
|
|||||||
compose_yaml_path(),
|
compose_yaml_path(),
|
||||||
"down",
|
"down",
|
||||||
])
|
])
|
||||||
|
|
||||||
|
"""
|
||||||
|
Tests interpolation of COMPOSE_PROJECT_NAME in the podman-compose config,
|
||||||
|
which is different from external environment variables because COMPOSE_PROJECT_NAME
|
||||||
|
is a predefined environment variable generated from the `name` value in the top-level
|
||||||
|
of the compose.yaml.
|
||||||
|
|
||||||
|
See also
|
||||||
|
- https://docs.docker.com/reference/compose-file/interpolation/
|
||||||
|
- https://docs.docker.com/reference/compose-file/version-and-name/#name-top-level-element
|
||||||
|
- https://docs.docker.com/compose/how-tos/environment-variables/envvars/
|
||||||
|
- https://github.com/compose-spec/compose-spec/blob/main/04-version-and-name.md
|
||||||
|
"""
|
||||||
|
|
||||||
|
def test_project_name(self):
|
||||||
|
try:
|
||||||
|
output, _ = self.run_subprocess_assert_returncode([
|
||||||
|
podman_compose_path(),
|
||||||
|
"-f",
|
||||||
|
compose_yaml_path(),
|
||||||
|
"run",
|
||||||
|
"project-name-test",
|
||||||
|
])
|
||||||
|
self.assertIn("my-project-name", str(output))
|
||||||
|
finally:
|
||||||
|
self.run_subprocess_assert_returncode([
|
||||||
|
podman_compose_path(),
|
||||||
|
"-f",
|
||||||
|
compose_yaml_path(),
|
||||||
|
"down",
|
||||||
|
])
|
||||||
|
|
||||||
|
def test_project_name_override(self):
|
||||||
|
try:
|
||||||
|
output, _ = self.run_subprocess_assert_returncode([
|
||||||
|
podman_compose_path(),
|
||||||
|
"-f",
|
||||||
|
compose_yaml_path(),
|
||||||
|
"run",
|
||||||
|
"-e",
|
||||||
|
"COMPOSE_PROJECT_NAME=project-name-override",
|
||||||
|
"project-name-test",
|
||||||
|
])
|
||||||
|
self.assertIn("project-name-override", str(output))
|
||||||
|
finally:
|
||||||
|
self.run_subprocess_assert_returncode([
|
||||||
|
podman_compose_path(),
|
||||||
|
"-f",
|
||||||
|
compose_yaml_path(),
|
||||||
|
"down",
|
||||||
|
])
|
||||||
|
Loading…
Reference in New Issue
Block a user