Skip to content

Commit 52278fe

Browse files
authored
Merge pull request #13 from getsentry/iw/docker-compos-error-handling
fix(cli): Adding basic error handling to docker-compose commands
2 parents 1c9ec10 + a66a05f commit 52278fe

File tree

6 files changed

+53
-13
lines changed

6 files changed

+53
-13
lines changed

src/commands/logs.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
from constants import DEVSERVICES_DIR_NAME
1010
from constants import DOCKER_COMPOSE_FILE_NAME
11+
from exceptions import DockerComposeError
1112
from utils.docker_compose import run_docker_compose_command
1213
from utils.services import find_matching_service
1314

@@ -38,8 +39,12 @@ def logs(args: Namespace) -> None:
3839
service_config_file_path = os.path.join(
3940
service.repo_path, DEVSERVICES_DIR_NAME, DOCKER_COMPOSE_FILE_NAME
4041
)
41-
logs = run_docker_compose_command(
42-
f"-f {service_config_file_path} logs {mode_dependencies}"
43-
)
42+
try:
43+
logs = run_docker_compose_command(
44+
f"-f {service_config_file_path} logs {mode_dependencies}"
45+
)
46+
except DockerComposeError as dce:
47+
print(f"Failed to get logs for {service.name}: {dce.stderr}")
48+
exit(1)
4449
sys.stdout.write(logs.stdout)
4550
sys.stdout.flush()

src/commands/start.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
from constants import DEVSERVICES_DIR_NAME
99
from constants import DOCKER_COMPOSE_FILE_NAME
10+
from exceptions import DockerComposeError
1011
from utils.docker_compose import run_docker_compose_command
1112
from utils.services import find_matching_service
1213

@@ -34,6 +35,10 @@ def start(args: Namespace) -> None:
3435
service_config_file_path = os.path.join(
3536
service.repo_path, DEVSERVICES_DIR_NAME, DOCKER_COMPOSE_FILE_NAME
3637
)
37-
run_docker_compose_command(
38-
f"-f {service_config_file_path} up -d {mode_dependencies}"
39-
)
38+
try:
39+
run_docker_compose_command(
40+
f"-f {service_config_file_path} up -d {mode_dependencies}"
41+
)
42+
except DockerComposeError as dce:
43+
print(f"Failed to start {service.name}: {dce.stderr}")
44+
exit(1)

src/commands/status.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
from constants import DEVSERVICES_DIR_NAME
1111
from constants import DOCKER_COMPOSE_FILE_NAME
12+
from exceptions import DockerComposeError
1213
from utils.docker_compose import run_docker_compose_command
1314
from utils.services import find_matching_service
1415

@@ -74,9 +75,13 @@ def status(args: Namespace) -> None:
7475
service.repo_path, DEVSERVICES_DIR_NAME, DOCKER_COMPOSE_FILE_NAME
7576
)
7677
mode_dependencies = " ".join(modes[mode_to_view])
77-
status_json = run_docker_compose_command(
78-
f"-f {service_config_file_path} ps {mode_dependencies} --format json"
79-
).stdout
78+
try:
79+
status_json = run_docker_compose_command(
80+
f"-f {service_config_file_path} ps {mode_dependencies} --format json"
81+
).stdout
82+
except DockerComposeError as dce:
83+
print(f"Failed to get status for {service.name}: {dce.stderr}")
84+
exit(1)
8085
# If the service is not running, the status_json will be empty
8186
if not status_json:
8287
print(f"{service.name} is not running")

src/commands/stop.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
from constants import DEVSERVICES_DIR_NAME
99
from constants import DOCKER_COMPOSE_FILE_NAME
10+
from exceptions import DockerComposeError
1011
from utils.docker_compose import run_docker_compose_command
1112
from utils.services import find_matching_service
1213

@@ -34,6 +35,10 @@ def stop(args: Namespace) -> None:
3435
service_config_file_path = os.path.join(
3536
service.repo_path, DEVSERVICES_DIR_NAME, DOCKER_COMPOSE_FILE_NAME
3637
)
37-
run_docker_compose_command(
38-
f"-f {service_config_file_path} down {mode_dependencies}"
39-
)
38+
try:
39+
run_docker_compose_command(
40+
f"-f {service_config_file_path} down {mode_dependencies}"
41+
)
42+
except DockerComposeError as dce:
43+
print(f"Failed to stop {service.name}: {dce.stderr}")
44+
exit(1)

src/exceptions.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,13 @@ class ConfigParseError(ConfigError):
2929
"""Raised when a configuration file cannot be parsed."""
3030

3131
pass
32+
33+
34+
class DockerComposeError(Exception):
35+
"""Base class for Docker Compose related errors."""
36+
37+
def __init__(self, command: str, returncode: int, stdout: str, stderr: str):
38+
self.command = command
39+
self.returncode = returncode
40+
self.stdout = stdout
41+
self.stderr = stderr

src/utils/docker_compose.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,17 @@
22

33
import subprocess
44

5+
from exceptions import DockerComposeError
6+
57

68
def run_docker_compose_command(command: str) -> subprocess.CompletedProcess[str]:
79
cmd = ["docker", "compose"] + command.split()
8-
return subprocess.run(cmd, check=True, capture_output=True, text=True)
10+
try:
11+
return subprocess.run(cmd, check=True, capture_output=True, text=True)
12+
except subprocess.CalledProcessError as e:
13+
raise DockerComposeError(
14+
command=command,
15+
returncode=e.returncode,
16+
stdout=e.stdout,
17+
stderr=e.stderr,
18+
)

0 commit comments

Comments
 (0)