diff --git a/conductr_cli/terminal.py b/conductr_cli/terminal.py
index 2c27df4..84205cb 100644
--- a/conductr_cli/terminal.py
+++ b/conductr_cli/terminal.py
@@ -28,7 +28,9 @@ def docker_inspect(container_id, inspect_format=None):
 
 def docker_run(optional_args, image, positional_args):
     cmd = ['docker', 'run'] + optional_args + [image] + positional_args
-    return subprocess.call(cmd)
+    status = subprocess.call(cmd)
+    assert status == 0, 'docker exited with {}'.format(status)
+    return 0
 
 
 def docker_rm(containers):

Sandbox startup failing to start haproxy doesn't result in error
* Run a program that binds on port 9000
* Start the sandbox. Notice docker complains, but the sandbox doesn't notice.

We should fail fast and tell the user about the `--bundle-http-port` flag / `BUNDLE_HTTP_PORT` env variable
diff --git a/conductr_cli/test/test_terminal.py b/conductr_cli/test/test_terminal.py
index d6ff783..0337492 100644
--- a/conductr_cli/test/test_terminal.py
+++ b/conductr_cli/test/test_terminal.py
@@ -72,7 +72,7 @@ class TestTerminal(CliTestCase):
         image = 'image:version'
         positional_args = ['--discover-host-ip']
         stdout = MagicMock()
-        subprocess_call_mock = MagicMock()
+        subprocess_call_mock = MagicMock(return_value=0)
 
         with patch('subprocess.call', subprocess_call_mock), \
                 patch('sys.stdout', stdout):
@@ -81,6 +81,21 @@ class TestTerminal(CliTestCase):
         self.assertEqual('', self.output(stdout))
         subprocess_call_mock.assert_called_with(['docker', 'run'] + optional_args + [image] + positional_args)
 
+    def test_docker_run_fail(self):
+        optional_args = ['-p', '9001:9001', '-e', 'AKKA_LOGLEVEL=info']
+        image = 'image:version'
+        positional_args = ['--discover-host-ip']
+        stdout = MagicMock()
+        subprocess_call_mock = MagicMock(return_value=1)
+
+        with patch('subprocess.call', subprocess_call_mock), \
+                patch('sys.stdout', stdout), \
+                self.assertRaises(AssertionError):
+            terminal.docker_run(optional_args, image, positional_args)
+
+        self.assertEqual('', self.output(stdout))
+        subprocess_call_mock.assert_called_with(['docker', 'run'] + optional_args + [image] + positional_args)
+
     def test_docker_rm(self):
         containers = ['cond-0', 'cond-1']
         stdout = MagicMock()

pip install -e .
parse_log_pytest
pytest
pytest
3.9
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
argcomplete==3.6.1
arrow==1.3.0
boto3==1.37.23
botocore==1.37.23
certifi==2025.1.31
charset-normalizer==3.4.1
colorama==0.4.6
-e git+https://github.com/typesafehub/conductr-cli.git@2df68846f22c4ab568e7430d19920617e52d0d62#egg=conductr_cli
exceptiongroup @ file:///croot/exceptiongroup_1706031385326/work
idna==3.10
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
jmespath==1.0.1
jsonschema==2.6.0
packaging @ file:///croot/packaging_1734472117206/work
pager==3.3
pluggy @ file:///croot/pluggy_1733169602837/work
prettytable==0.7.2
psutil==5.9.8
Pygments==2.19.1
pyhocon==0.3.35
PyJWT==1.4.2
pyparsing==3.2.3
pyreadline==2.1
pytest @ file:///croot/pytest_1738938843180/work
python-dateutil==2.9.0.post0
requests==2.32.3
requests-toolbelt==1.0.0
s3transfer==0.11.4
semver==3.0.4
six==1.17.0
sseclient==0.0.14
toml==0.10.2
tomli @ file:///opt/conda/conda-bld/tomli_1657175507142/work
types-python-dateutil==2.9.0.20241206
urllib3==1.26.20
www-authenticate==0.9.2

name: conductr-cli
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - exceptiongroup=1.2.0=py39h06a4308_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - packaging=24.2=py39h06a4308_0
  - pip=25.0=py39h06a4308_0
  - pluggy=1.5.0=py39h06a4308_0
  - pytest=8.3.4=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tomli=2.0.1=py39h06a4308_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - argcomplete==3.6.1
      - arrow==1.3.0
      - boto3==1.37.23
      - botocore==1.37.23
      - certifi==2025.1.31
      - charset-normalizer==3.4.1
      - colorama==0.4.6
      - idna==3.10
      - jmespath==1.0.1
      - jsonschema==2.6.0
      - pager==3.3
      - prettytable==0.7.2
      - psutil==5.9.8
      - pygments==2.19.1
      - pyhocon==0.3.35
      - pyjwt==1.4.2
      - pyparsing==3.2.3
      - pyreadline==2.1
      - python-dateutil==2.9.0.post0
      - requests==2.32.3
      - requests-toolbelt==1.0.0
      - s3transfer==0.11.4
      - semver==3.0.4
      - six==1.17.0
      - sseclient==0.0.14
      - toml==0.10.2
      - types-python-dateutil==2.9.0.20241206
      - urllib3==1.26.20
      - www-authenticate==0.9.2
prefix: /opt/conda/envs/conductr-cli

conductr_cli/test/test_terminal.py::TestTerminal::test_docker_run_fail
conductr_cli/test/test_terminal.py::TestTerminal::test_docker_images conductr_cli/test/test_terminal.py::TestTerminal::test_docker_info conductr_cli/test/test_terminal.py::TestTerminal::test_docker_inspect conductr_cli/test/test_terminal.py::TestTerminal::test_docker_ps conductr_cli/test/test_terminal.py::TestTerminal::test_docker_pull conductr_cli/test/test_terminal.py::TestTerminal::test_docker_rm conductr_cli/test/test_terminal.py::TestTerminal::test_docker_run
conductr_cli/terminal.py
conductr_cli/terminal.py