Skip to content

Commit ee01331

Browse files
authored
Merge pull request #860 from aripollak/fix-env-vars-with-equals
Allow run/exec -e with equals sign in value
2 parents f2f2f15 + f2f5483 commit ee01331

File tree

3 files changed

+127
-12
lines changed

3 files changed

+127
-12
lines changed

podman_compose.py

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2455,6 +2455,18 @@ async def compose_run(compose, args):
24552455
)
24562456
await compose.commands["build"](compose, build_args)
24572457

2458+
compose_run_update_container_from_args(compose, cnt, args)
2459+
# run podman
2460+
podman_args = await container_to_args(compose, cnt, args.detach)
2461+
if not args.detach:
2462+
podman_args.insert(1, "-i")
2463+
if args.rm:
2464+
podman_args.insert(1, "--rm")
2465+
p = await compose.podman.run([], "run", podman_args)
2466+
sys.exit(p)
2467+
2468+
2469+
def compose_run_update_container_from_args(compose, cnt, args):
24582470
# adjust one-off container options
24592471
name0 = "{}_{}_tmp{}".format(compose.project_name, args.service, random.randrange(0, 65536))
24602472
cnt["name"] = args.name or name0
@@ -2466,7 +2478,7 @@ async def compose_run(compose, args):
24662478
cnt["working_dir"] = args.workdir
24672479
env = dict(cnt.get("environment", {}))
24682480
if args.env:
2469-
additional_env_vars = dict(map(lambda each: each.split("="), args.env))
2481+
additional_env_vars = dict(map(lambda each: each.split("=", maxsplit=1), args.env))
24702482
env.update(additional_env_vars)
24712483
cnt["environment"] = env
24722484
if not args.service_ports:
@@ -2486,14 +2498,6 @@ async def compose_run(compose, args):
24862498
# can't restart and --rm
24872499
if args.rm and "restart" in cnt:
24882500
del cnt["restart"]
2489-
# run podman
2490-
podman_args = await container_to_args(compose, cnt, args.detach)
2491-
if not args.detach:
2492-
podman_args.insert(1, "-i")
2493-
if args.rm:
2494-
podman_args.insert(1, "--rm")
2495-
p = await compose.podman.run([], "run", podman_args)
2496-
sys.exit(p)
24972501

24982502

24992503
@cmd_run(podman_compose, "exec", "execute a command in a running container")
@@ -2502,6 +2506,12 @@ async def compose_exec(compose, args):
25022506
container_names = compose.container_names_by_service[args.service]
25032507
container_name = container_names[args.index - 1]
25042508
cnt = compose.container_by_name[container_name]
2509+
podman_args = compose_exec_args(cnt, container_name, args)
2510+
p = await compose.podman.run([], "exec", podman_args)
2511+
sys.exit(p)
2512+
2513+
2514+
def compose_exec_args(cnt, container_name, args):
25052515
podman_args = ["--interactive"]
25062516
if args.privileged:
25072517
podman_args += ["--privileged"]
@@ -2514,16 +2524,15 @@ async def compose_exec(compose, args):
25142524
env = dict(cnt.get("environment", {}))
25152525
if args.env:
25162526
additional_env_vars = dict(
2517-
map(lambda each: each.split("=") if "=" in each else (each, None), args.env)
2527+
map(lambda each: each.split("=", maxsplit=1) if "=" in each else (each, None), args.env)
25182528
)
25192529
env.update(additional_env_vars)
25202530
for name, value in env.items():
25212531
podman_args += ["--env", f"{name}" if value is None else f"{name}={value}"]
25222532
podman_args += [container_name]
25232533
if args.cnt_command is not None and len(args.cnt_command) > 0:
25242534
podman_args += args.cnt_command
2525-
p = await compose.podman.run([], "exec", podman_args)
2526-
sys.exit(p)
2535+
return podman_args
25272536

25282537

25292538
async def transfer_service_status(compose, args, action):

pytests/test_compose_exec_args.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
# SPDX-License-Identifier: GPL-2.0
2+
3+
import argparse
4+
import unittest
5+
6+
from podman_compose import compose_exec_args
7+
8+
9+
class TestExecArgs(unittest.TestCase):
10+
def test_minimal(self):
11+
cnt = get_minimal_container()
12+
args = get_minimal_args()
13+
14+
result = compose_exec_args(cnt, "container_name", args)
15+
expected = ["--interactive", "--tty", "container_name"]
16+
self.assertEqual(result, expected)
17+
18+
def test_additional_env_value_equals(self):
19+
cnt = get_minimal_container()
20+
args = get_minimal_args()
21+
args.env = ["key=valuepart1=valuepart2"]
22+
23+
result = compose_exec_args(cnt, "container_name", args)
24+
expected = [
25+
"--interactive",
26+
"--tty",
27+
"--env",
28+
"key=valuepart1=valuepart2",
29+
"container_name",
30+
]
31+
self.assertEqual(result, expected)
32+
33+
34+
def get_minimal_container():
35+
return {}
36+
37+
38+
def get_minimal_args():
39+
return argparse.Namespace(
40+
T=None,
41+
cnt_command=None,
42+
env=None,
43+
privileged=None,
44+
user=None,
45+
workdir=None,
46+
)
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
# SPDX-License-Identifier: GPL-2.0
2+
3+
import argparse
4+
import unittest
5+
6+
from podman_compose import PodmanCompose
7+
from podman_compose import compose_run_update_container_from_args
8+
9+
10+
class TestRunArgs(unittest.TestCase):
11+
def test_minimal(self):
12+
cnt = get_minimal_container()
13+
compose = get_minimal_compose()
14+
args = get_minimal_args()
15+
16+
compose_run_update_container_from_args(compose, cnt, args)
17+
18+
expected_cnt = {"name": "default_name", "tty": True}
19+
self.assertEqual(cnt, expected_cnt)
20+
21+
def test_additional_env_value_equals(self):
22+
cnt = get_minimal_container()
23+
compose = get_minimal_compose()
24+
args = get_minimal_args()
25+
args.env = ["key=valuepart1=valuepart2"]
26+
27+
compose_run_update_container_from_args(compose, cnt, args)
28+
29+
expected_cnt = {
30+
"environment": {
31+
"key": "valuepart1=valuepart2",
32+
},
33+
"name": "default_name",
34+
"tty": True,
35+
}
36+
self.assertEqual(cnt, expected_cnt)
37+
38+
39+
def get_minimal_container():
40+
return {}
41+
42+
43+
def get_minimal_compose():
44+
return PodmanCompose()
45+
46+
47+
def get_minimal_args():
48+
return argparse.Namespace(
49+
T=None,
50+
cnt_command=None,
51+
entrypoint=None,
52+
env=None,
53+
name="default_name",
54+
rm=None,
55+
service=None,
56+
service_ports=None,
57+
user=None,
58+
volume=None,
59+
workdir=None,
60+
)

0 commit comments

Comments
 (0)