diff --git a/remoteappmanager/docker/image.py b/remoteappmanager/docker/image.py
index 5413320..85262a6 100644
--- a/remoteappmanager/docker/image.py
+++ b/remoteappmanager/docker/image.py
@@ -24,7 +24,14 @@ class Image(HasTraits):
     @classmethod
     def from_docker_dict(cls, docker_dict):
         """Converts the dict response from the dockerpy library into an
-        instance of this class, extracting the relevant information."""
+        instance of this class, extracting the relevant information.
+
+        Parameters
+        ----------
+        docker_dict : dict
+           Results of `docker.client.inspect_image` or an item of the
+           result of `docker.client.images`
+        """
         self = cls()
         self.docker_id = docker_dict["Id"]
 
@@ -33,7 +40,9 @@ class Image(HasTraits):
         except (KeyError, IndexError):
             self.name = ''
 
-        labels = docker_dict.get("Labels")
+        labels = (docker_dict.get("Labels") or
+                  docker_dict.get("Config", {}).get("Labels"))
+
         if labels is not None:
             self.ui_name = labels.get(docker_labels.UI_NAME, '')
             self.icon_128 = labels.get(docker_labels.ICON_128, '')

Image's ui_name are no longer shown
Docker images with a `ui_name` label no longer has its name shown on the home page of the singleuser app.
It is a retrogression.
diff --git a/tests/docker/test_container_manager.py b/tests/docker/test_container_manager.py
index 0dc216d..7610825 100644
--- a/tests/docker/test_container_manager.py
+++ b/tests/docker/test_container_manager.py
@@ -108,7 +108,7 @@ class TestContainerManager(AsyncTestCase):
         self.assertEqual(image.description,
                          'Ubuntu machine with mayavi preinstalled')
         self.assertEqual(image.icon_128, "")
-        self.assertEqual(image.ui_name, "")
+        self.assertEqual(image.ui_name, "Mayavi 4.4.4")
         self.assertEqual(image.docker_id,
                          'sha256:e54d71dde57576e9d2a4c77ce0c98501c8aa6268de5b2987e4c80e2e157cffe4')  # noqa
 
diff --git a/tests/docker/test_image.py b/tests/docker/test_image.py
index 29cc03d..c21733f 100644
--- a/tests/docker/test_image.py
+++ b/tests/docker/test_image.py
@@ -6,12 +6,28 @@ from tests.utils import mock_docker_client
 
 
 class TestImage(TestCase):
-    def test_from_docker_dict(self):
+    def test_from_docker_dict_images(self):
         docker_client = mock_docker_client()
-        images = docker_client.images()
-        image = Image.from_docker_dict(images[0])
+        image_dict = docker_client.images()[0]
+        image = Image.from_docker_dict(image_dict)
 
-        self.assertEqual(image.docker_id, images[0]["Id"])
-        self.assertEqual(image.name, images[0]["RepoTags"][0])
+        self.assertEqual(image.docker_id, image_dict["Id"])
+        self.assertEqual(image.name, image_dict["RepoTags"][0])
         self.assertEqual(image.description,
-                         images[0]["Labels"][docker_labels.DESCRIPTION])
+                         image_dict["Labels"][docker_labels.DESCRIPTION])
+        self.assertEqual(image.ui_name,
+                         image_dict["Labels"][docker_labels.UI_NAME])
+
+    def test_from_docker_dict_inspect_image(self):
+        docker_client = mock_docker_client()
+        image_dict = docker_client.inspect_image()
+        image = Image.from_docker_dict(image_dict)
+
+        self.assertEqual(image.docker_id, image_dict["Id"])
+        self.assertEqual(image.name, image_dict["RepoTags"][0])
+        self.assertEqual(
+            image.description,
+            image_dict['Config']["Labels"][docker_labels.DESCRIPTION])
+        self.assertEqual(
+            image.ui_name,
+            image_dict['Config']["Labels"][docker_labels.UI_NAME])
diff --git a/tests/utils.py b/tests/utils.py
index d35f7e9..2a6a5d7 100644
--- a/tests/utils.py
+++ b/tests/utils.py
@@ -13,19 +13,36 @@ def mock_docker_client():
     """Returns a mock synchronous docker client to return canned
     responses."""
     docker_client = mock.Mock(spec=docker.Client)
+
+    # Note that the structure of the returned dictionary is different
+    # for `inspect_image` and for `images`
+    # The return value is simplified...
     docker_client.inspect_image = mock.Mock(
-        return_value={'Created': 1463662803,
-                      'Id':
-                          'sha256:e54d71dde57576e9d2a4c77ce0c98501c8aa6268de5b2987e4c80e2e157cffe4',  # noqa
-                      'Labels': {
-                        'eu.simphony-project.docker.description':
-                            'Ubuntu machine with mayavi preinstalled'
-                      },
-                      'ParentId': 'sha256:d2f7240076e135f6aba57185e54ff45cc158781c787897b67994f72fe668ad07',  # noqa
-                      'RepoDigests': None,
-                      'RepoTags': ['simphony/mayavi-4.4.4:latest'],
-                      'Size': 1094833658,
-                      'VirtualSize': 1094833658})
+        return_value= {
+            'Author': 'SimPhoNy Team',
+            'Comment': '',
+            'Config': {'Cmd': None,
+                       'Domainname': '',
+                       'Entrypoint': ['/startup.sh'],
+                       'Env': ['PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin',
+                               'DEBIAN_FRONTEND=noninteractive',
+                               'HOME=/root'],
+                       'ExposedPorts': {'8888/tcp': {}},
+                       'Hostname': 'dfc2eabdf236',
+                       'Image': 'sha256:912b31a4e4f185b918999540040bb158e208ce0123fde4be07c188b2ab5aa4bb',
+                       'Labels': {'eu.simphony-project.docker.description': 'Ubuntu machine with mayavi preinstalled',  # noqa
+                                  'eu.simphony-project.docker.ui_name': 'Mayavi 4.4.4'},  # noqa
+                       'OnBuild': [],
+                       'OpenStdin': False,
+                       'StdinOnce': False,
+                       'Tty': False,
+                       'User': '',
+                       'Volumes': None,
+                       'WorkingDir': '/root'},
+            'Id': 'sha256:e54d71dde57576e9d2a4c77ce0c98501c8aa6268de5b2987e4c80e2e157cffe4',
+            'RepoTags': ['simphony/mayavi-4.4.4:latest'],
+            'Size': 668483801,
+            'VirtualSize': 668483801})
     docker_client.inspect_container = mock.Mock(return_value=None)
     docker_client.create_host_config = mock.Mock(return_value={})
     docker_client.create_container = mock.Mock(
@@ -41,7 +58,8 @@ def mock_docker_client():
             {'Created': 1463662803,
              'Id': 'sha256:e54d71dde57576e9d2a4c77ce0c98501c8aa6268de5b2987e4c80e2e157cffe4',  # noqa
              'Labels': {
-             'eu.simphony-project.docker.description': 'Ubuntu machine with mayavi preinstalled'  # noqa
+                 'eu.simphony-project.docker.description': 'Ubuntu machine with mayavi preinstalled',  # noqa
+                 'eu.simphony-project.docker.ui_name': 'Mayavi 4.4.4'  # noqa
              },
             'ParentId': 'sha256:d2f7240076e135f6aba57185e54ff45cc158781c787897b67994f72fe668ad07',  # noqa
             'RepoDigests': None,

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest
apt-get update apt-get install -y gcc
3.9
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
alembic==1.15.2
annotated-types==0.7.0
arrow==1.3.0
async-generator==1.10
attrs==25.3.0
certifi==2025.1.31
certipy==0.2.2
cffi==1.17.1
charset-normalizer==3.4.1
click==8.1.8
cryptography==44.0.2
docker-py==1.10.6
docker-pycreds==0.4.0
escapism==1.0.1
exceptiongroup==1.2.2
fqdn==1.5.1
greenlet==3.1.1
idna==3.10
importlib_metadata==8.6.1
iniconfig==2.1.0
isoduration==20.11.0
Jinja2==3.1.6
jsonpointer==3.0.0
jsonschema==4.23.0
jsonschema-specifications==2024.10.1
jupyter-events==0.12.0
jupyter_client==8.6.3
jupyter_core==5.7.2
jupyterhub==5.2.1
Mako==1.3.9
MarkupSafe==3.0.2
oauthlib==3.2.2
packaging==24.2
pamela==1.2.0
platformdirs==4.3.7
pluggy==1.5.0
prometheus_client==0.21.1
pycparser==2.22
pydantic==2.11.1
pydantic_core==2.33.0
pytest==8.3.5
python-dateutil==2.9.0.post0
python-json-logger==3.3.0
PyYAML==6.0.2
pyzmq==26.3.0
referencing==0.36.2
-e git+https://github.com/simphony/simphony-remote.git@d2583387a396fa2b3e4ffdff37a3308d0200e2d5#egg=remoteappmanager
requests==2.32.3
rfc3339-validator==0.1.4
rfc3986-validator==0.1.1
rpds-py==0.24.0
six==1.17.0
SQLAlchemy==2.0.40
tabulate==0.9.0
tomli==2.2.1
tornado==6.4.2
traitlets==5.14.3
types-python-dateutil==2.9.0.20241206
typing-inspection==0.4.0
typing_extensions==4.13.0
uri-template==1.3.0
urllib3==2.3.0
webcolors==24.11.1
websocket-client==1.8.0
zipp==3.21.0

name: simphony-remote
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
  - 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
  - pip=25.0=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
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - alembic==1.15.2
      - annotated-types==0.7.0
      - arrow==1.3.0
      - async-generator==1.10
      - attrs==25.3.0
      - certifi==2025.1.31
      - certipy==0.2.2
      - cffi==1.17.1
      - charset-normalizer==3.4.1
      - click==8.1.8
      - cryptography==44.0.2
      - docker-py==1.10.6
      - docker-pycreds==0.4.0
      - escapism==1.0.1
      - exceptiongroup==1.2.2
      - fqdn==1.5.1
      - greenlet==3.1.1
      - idna==3.10
      - importlib-metadata==8.6.1
      - iniconfig==2.1.0
      - isoduration==20.11.0
      - jinja2==3.1.6
      - jsonpointer==3.0.0
      - jsonschema==4.23.0
      - jsonschema-specifications==2024.10.1
      - jupyter-client==8.6.3
      - jupyter-core==5.7.2
      - jupyter-events==0.12.0
      - jupyterhub==5.2.1
      - mako==1.3.9
      - markupsafe==3.0.2
      - oauthlib==3.2.2
      - packaging==24.2
      - pamela==1.2.0
      - platformdirs==4.3.7
      - pluggy==1.5.0
      - prometheus-client==0.21.1
      - pycparser==2.22
      - pydantic==2.11.1
      - pydantic-core==2.33.0
      - pytest==8.3.5
      - python-dateutil==2.9.0.post0
      - python-json-logger==3.3.0
      - pyyaml==6.0.2
      - pyzmq==26.3.0
      - referencing==0.36.2
      - requests==2.32.3
      - rfc3339-validator==0.1.4
      - rfc3986-validator==0.1.1
      - rpds-py==0.24.0
      - six==1.17.0
      - sqlalchemy==2.0.40
      - tabulate==0.9.0
      - tomli==2.2.1
      - tornado==6.4.2
      - traitlets==5.14.3
      - types-python-dateutil==2.9.0.20241206
      - typing-extensions==4.13.0
      - typing-inspection==0.4.0
      - uri-template==1.3.0
      - urllib3==2.3.0
      - webcolors==24.11.1
      - websocket-client==1.8.0
      - zipp==3.21.0
prefix: /opt/conda/envs/simphony-remote

tests/docker/test_container_manager.py::TestContainerManager::test_image tests/docker/test_image.py::TestImage::test_from_docker_dict_inspect_image
tests/docker/test_container_manager.py::TestContainerManager::test_containers_from_mapping_id tests/docker/test_container_manager.py::TestContainerManager::test_instantiation tests/docker/test_container_manager.py::TestContainerManager::test_race_condition_spawning tests/docker/test_container_manager.py::TestContainerManager::test_start_already_present_container tests/docker/test_container_manager.py::TestContainerManager::test_start_container_exception_cleanup tests/docker/test_container_manager.py::TestContainerManager::test_start_container_exception_cleanup_2 tests/docker/test_container_manager.py::TestContainerManager::test_start_container_with_nonexisting_volume_source tests/docker/test_container_manager.py::TestContainerManager::test_start_stop tests/docker/test_image.py::TestImage::test_from_docker_dict_images
remoteappmanager/docker/image.py
remoteappmanager/docker/image.py