mirror of
https://github.com/containers/podman-compose.git
synced 2025-05-20 14:10:56 +02:00
Handle exit code when compose up -d
Signed-off-by: Elsa <zeyugao@outlook.com>
This commit is contained in:
parent
7497692b19
commit
67616bdaac
1
newsfragments/handle-up-detach-exitcode.bugfix
Normal file
1
newsfragments/handle-up-detach-exitcode.bugfix
Normal file
@ -0,0 +1 @@
|
|||||||
|
- Return non-zero exit_code on failure when `up -d`
|
@ -2879,11 +2879,15 @@ def deps_from_container(args, cnt):
|
|||||||
@cmd_run(podman_compose, "up", "Create and start the entire stack or some of its services")
|
@cmd_run(podman_compose, "up", "Create and start the entire stack or some of its services")
|
||||||
async def compose_up(compose: PodmanCompose, args):
|
async def compose_up(compose: PodmanCompose, args):
|
||||||
excluded = get_excluded(compose, args)
|
excluded = get_excluded(compose, args)
|
||||||
|
|
||||||
if not args.no_build:
|
if not args.no_build:
|
||||||
# `podman build` does not cache, so don't always build
|
# `podman build` does not cache, so don't always build
|
||||||
build_args = argparse.Namespace(if_not_exists=(not args.build), **args.__dict__)
|
build_args = argparse.Namespace(if_not_exists=(not args.build), **args.__dict__)
|
||||||
if await compose.commands["build"](compose, build_args) != 0:
|
build_exit_code = await compose.commands["build"](compose, build_args)
|
||||||
|
if build_exit_code != 0:
|
||||||
log.error("Build command failed")
|
log.error("Build command failed")
|
||||||
|
if not args.dry_run:
|
||||||
|
return build_exit_code
|
||||||
|
|
||||||
hashes = (
|
hashes = (
|
||||||
(
|
(
|
||||||
@ -2911,19 +2915,29 @@ async def compose_up(compose: PodmanCompose, args):
|
|||||||
# args.no_recreate disables check for changes (which is not implemented)
|
# args.no_recreate disables check for changes (which is not implemented)
|
||||||
|
|
||||||
await create_pods(compose, args)
|
await create_pods(compose, args)
|
||||||
|
exit_code = 0
|
||||||
for cnt in compose.containers:
|
for cnt in compose.containers:
|
||||||
if cnt["_service"] in excluded:
|
if cnt["_service"] in excluded:
|
||||||
log.debug("** skipping: %s", cnt["name"])
|
log.debug("** skipping: %s", cnt["name"])
|
||||||
continue
|
continue
|
||||||
podman_args = await container_to_args(compose, cnt, detached=False, no_deps=args.no_deps)
|
podman_args = await container_to_args(compose, cnt, detached=False, no_deps=args.no_deps)
|
||||||
subproc = await compose.podman.run([], "create", podman_args)
|
subproc_exit_code = await compose.podman.run([], "create", podman_args)
|
||||||
if not args.no_start and args.detach and subproc is not None:
|
if subproc_exit_code is not None and subproc_exit_code != 0:
|
||||||
await run_container(
|
exit_code = subproc_exit_code
|
||||||
|
|
||||||
|
if not args.no_start and args.detach and subproc_exit_code is not None:
|
||||||
|
container_exit_code = await run_container(
|
||||||
compose, cnt["name"], deps_from_container(args, cnt), ([], "start", [cnt["name"]])
|
compose, cnt["name"], deps_from_container(args, cnt), ([], "start", [cnt["name"]])
|
||||||
)
|
)
|
||||||
|
|
||||||
if args.no_start or args.detach or args.dry_run:
|
if container_exit_code is not None and container_exit_code != 0:
|
||||||
return
|
exit_code = container_exit_code
|
||||||
|
|
||||||
|
if args.dry_run:
|
||||||
|
return None
|
||||||
|
if args.no_start or args.detach:
|
||||||
|
return exit_code
|
||||||
|
|
||||||
# TODO: handle already existing
|
# TODO: handle already existing
|
||||||
# TODO: if error creating do not enter loop
|
# TODO: if error creating do not enter loop
|
||||||
# TODO: colors if sys.stdout.isatty()
|
# TODO: colors if sys.stdout.isatty()
|
||||||
|
@ -21,6 +21,16 @@ def podman_compose_path():
|
|||||||
return os.path.join(base_path(), "podman_compose.py")
|
return os.path.join(base_path(), "podman_compose.py")
|
||||||
|
|
||||||
|
|
||||||
|
def is_root():
|
||||||
|
return os.geteuid() == 0
|
||||||
|
|
||||||
|
|
||||||
|
def failure_exitcode_when_rootful():
|
||||||
|
if is_root():
|
||||||
|
return 125
|
||||||
|
return 0
|
||||||
|
|
||||||
|
|
||||||
# If a compose file has userns_mode set, setting in_pod to True, results in error.
|
# If a compose file has userns_mode set, setting in_pod to True, results in error.
|
||||||
# Default in_pod setting is True, unless compose file provides otherwise.
|
# Default in_pod setting is True, unless compose file provides otherwise.
|
||||||
# Compose file provides custom in_pod option, which can be overridden by command line in_pod option.
|
# Compose file provides custom in_pod option, which can be overridden by command line in_pod option.
|
||||||
@ -64,7 +74,7 @@ class TestPodmanComposeInPod(unittest.TestCase, RunSubprocessMixin):
|
|||||||
]
|
]
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self.run_subprocess_assert_returncode(command_up)
|
self.run_subprocess_assert_returncode(command_up, failure_exitcode_when_rootful())
|
||||||
|
|
||||||
finally:
|
finally:
|
||||||
self.run_subprocess_assert_returncode(down_cmd)
|
self.run_subprocess_assert_returncode(down_cmd)
|
||||||
@ -96,7 +106,7 @@ class TestPodmanComposeInPod(unittest.TestCase, RunSubprocessMixin):
|
|||||||
]
|
]
|
||||||
|
|
||||||
try:
|
try:
|
||||||
out, err = self.run_subprocess_assert_returncode(command_up)
|
out, err = self.run_subprocess_assert_returncode(command_up, 125)
|
||||||
self.assertEqual(b"Error: --userns and --pod cannot be set together" in err, True)
|
self.assertEqual(b"Error: --userns and --pod cannot be set together" in err, True)
|
||||||
|
|
||||||
finally:
|
finally:
|
||||||
@ -142,7 +152,7 @@ class TestPodmanComposeInPod(unittest.TestCase, RunSubprocessMixin):
|
|||||||
]
|
]
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self.run_subprocess_assert_returncode(command_up)
|
self.run_subprocess_assert_returncode(command_up, failure_exitcode_when_rootful())
|
||||||
|
|
||||||
finally:
|
finally:
|
||||||
self.run_subprocess_assert_returncode(down_cmd)
|
self.run_subprocess_assert_returncode(down_cmd)
|
||||||
@ -188,7 +198,7 @@ class TestPodmanComposeInPod(unittest.TestCase, RunSubprocessMixin):
|
|||||||
]
|
]
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self.run_subprocess_assert_returncode(command_up)
|
self.run_subprocess_assert_returncode(command_up, failure_exitcode_when_rootful())
|
||||||
|
|
||||||
finally:
|
finally:
|
||||||
self.run_subprocess_assert_returncode(down_cmd)
|
self.run_subprocess_assert_returncode(down_cmd)
|
||||||
@ -221,7 +231,7 @@ class TestPodmanComposeInPod(unittest.TestCase, RunSubprocessMixin):
|
|||||||
]
|
]
|
||||||
|
|
||||||
try:
|
try:
|
||||||
out, err = self.run_subprocess_assert_returncode(command_up)
|
out, err = self.run_subprocess_assert_returncode(command_up, 125)
|
||||||
self.assertEqual(b"Error: --userns and --pod cannot be set together" in err, True)
|
self.assertEqual(b"Error: --userns and --pod cannot be set together" in err, True)
|
||||||
|
|
||||||
finally:
|
finally:
|
||||||
@ -255,7 +265,7 @@ class TestPodmanComposeInPod(unittest.TestCase, RunSubprocessMixin):
|
|||||||
]
|
]
|
||||||
|
|
||||||
try:
|
try:
|
||||||
out, err = self.run_subprocess_assert_returncode(command_up)
|
out, err = self.run_subprocess_assert_returncode(command_up, 125)
|
||||||
self.assertEqual(b"Error: --userns and --pod cannot be set together" in err, True)
|
self.assertEqual(b"Error: --userns and --pod cannot be set together" in err, True)
|
||||||
|
|
||||||
finally:
|
finally:
|
||||||
@ -301,7 +311,7 @@ class TestPodmanComposeInPod(unittest.TestCase, RunSubprocessMixin):
|
|||||||
]
|
]
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self.run_subprocess_assert_returncode(command_up)
|
self.run_subprocess_assert_returncode(command_up, failure_exitcode_when_rootful())
|
||||||
|
|
||||||
finally:
|
finally:
|
||||||
self.run_subprocess_assert_returncode(down_cmd)
|
self.run_subprocess_assert_returncode(down_cmd)
|
||||||
@ -334,7 +344,7 @@ class TestPodmanComposeInPod(unittest.TestCase, RunSubprocessMixin):
|
|||||||
]
|
]
|
||||||
|
|
||||||
try:
|
try:
|
||||||
out, err = self.run_subprocess_assert_returncode(command_up)
|
out, err = self.run_subprocess_assert_returncode(command_up, 125)
|
||||||
self.assertEqual(b"Error: --userns and --pod cannot be set together" in err, True)
|
self.assertEqual(b"Error: --userns and --pod cannot be set together" in err, True)
|
||||||
|
|
||||||
finally:
|
finally:
|
||||||
@ -368,7 +378,7 @@ class TestPodmanComposeInPod(unittest.TestCase, RunSubprocessMixin):
|
|||||||
]
|
]
|
||||||
|
|
||||||
try:
|
try:
|
||||||
out, err = self.run_subprocess_assert_returncode(command_up)
|
out, err = self.run_subprocess_assert_returncode(command_up, 125)
|
||||||
self.assertEqual(b"Error: --userns and --pod cannot be set together" in err, True)
|
self.assertEqual(b"Error: --userns and --pod cannot be set together" in err, True)
|
||||||
|
|
||||||
finally:
|
finally:
|
||||||
@ -402,7 +412,7 @@ class TestPodmanComposeInPod(unittest.TestCase, RunSubprocessMixin):
|
|||||||
]
|
]
|
||||||
|
|
||||||
try:
|
try:
|
||||||
out, err = self.run_subprocess_assert_returncode(command_up)
|
out, err = self.run_subprocess_assert_returncode(command_up, 125)
|
||||||
self.assertEqual(b"Error: --userns and --pod cannot be set together" in err, True)
|
self.assertEqual(b"Error: --userns and --pod cannot be set together" in err, True)
|
||||||
|
|
||||||
finally:
|
finally:
|
||||||
@ -448,7 +458,7 @@ class TestPodmanComposeInPod(unittest.TestCase, RunSubprocessMixin):
|
|||||||
]
|
]
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self.run_subprocess_assert_returncode(command_up)
|
self.run_subprocess_assert_returncode(command_up, failure_exitcode_when_rootful())
|
||||||
|
|
||||||
finally:
|
finally:
|
||||||
self.run_subprocess_assert_returncode(down_cmd)
|
self.run_subprocess_assert_returncode(down_cmd)
|
||||||
@ -482,7 +492,7 @@ class TestPodmanComposeInPod(unittest.TestCase, RunSubprocessMixin):
|
|||||||
]
|
]
|
||||||
|
|
||||||
try:
|
try:
|
||||||
out, err = self.run_subprocess_assert_returncode(command_up)
|
out, err = self.run_subprocess_assert_returncode(command_up, 125)
|
||||||
self.assertEqual(b"Error: --userns and --pod cannot be set together" in err, True)
|
self.assertEqual(b"Error: --userns and --pod cannot be set together" in err, True)
|
||||||
|
|
||||||
finally:
|
finally:
|
||||||
|
Loading…
Reference in New Issue
Block a user