MqDockerUp: A tool to monitor and update your docker containers from Home Assistant

I happy to provide you exactly that, it creates a new card for each container and shows its entities. You need card-mod and auto-entities:

type: custom:auto-entities
show_empty: true
card:
  type: grid
  square: false
  columns: 1
card_param: cards
filter:
  template: |-
    {% set ns = namespace(entities=[]) %}
    {% for sensor in states.sensor %}
      {% if sensor.entity_id | regex_search("sensor\..*_container_name$", ignorecase=True) and sensor.state not in ['unavailable', 'unknown'] %}
        {% set container_name = sensor.attributes.friendly_name | regex_replace(" Container Name", "", ignorecase=True) %}
        
        {% set status_entity_id = sensor.entity_id | replace("_container_name", "_container_status") %}
        {% set registry_entity_id = sensor.entity_id | replace("_container_name", "_docker_registry") %}
        {% set image_entity_id = sensor.entity_id | replace("_container_name", "_docker_image") %}
        {% set tag_entity_id = sensor.entity_id | replace("_container_name", "_docker_tag") %}
        {% set ports_entity_id = sensor.entity_id | replace("_container_name", "_exposed_ports") %}
        
        {% set status_entity = states.sensor[status_entity_id.split('.')[1]] %}
        {% set registry_entity = states.sensor[registry_entity_id.split('.')[1]] %}
        {% set image_entity = states.sensor[image_entity_id.split('.')[1]] %}
        {% set tag_entity = states.sensor[tag_entity_id.split('.')[1]] %}
        {% set ports_entity = states.sensor[ports_entity_id.split('.')[1]] %}
        
        {% if status_entity is defined and status_entity.state not in ['unavailable', 'unknown'] %}
          {% set container_info = {
            'type': 'entities',
            'title': container_name,
            'entities': [
              {'entity': status_entity_id, 'name': status_entity.attributes.friendly_name | replace(container_name, "")},
              {'entity': registry_entity_id, 'name': registry_entity.attributes.friendly_name | replace(container_name, "")},
              {'entity': image_entity_id, 'name': image_entity.attributes.friendly_name | replace(container_name, "")},
              {'entity': tag_entity_id, 'name': tag_entity.attributes.friendly_name | replace(container_name, "")},
              {'entity': ports_entity_id, 'name': ports_entity.attributes.friendly_name | replace(container_name, "")},
            ]
          } %}
          {% set ns.entities = ns.entities + [container_info] %}
        {% endif %}
        
      {% endif %}
    {% endfor %} {{ ns.entities | tojson }}

2 Likes

Thanks for the code, I added the update value in your code:

{% set update_entity_id = sensor.entity_id | replace("_container_name", "_update") %}
{% set update_entity = update_entity_id | replace("sensor", "update") %}
{'entity': update_entity, 'name': "Update"}

See below:

type: custom:auto-entities
show_empty: true
card:
  type: grid
  square: false
  columns: 1
card_param: cards
filter:
  template: |-
    {% set ns = namespace(entities=[]) %}
    {% for sensor in states.sensor %}
      {% if sensor.entity_id | regex_search("sensor\..*_container_name.*$", ignorecase=True) and sensor.state not in ['unavailable', 'unknown'] %}
        {% set container_name = sensor.attributes.friendly_name | regex_replace(" Container Name", "", ignorecase=True) %}
        
        {% set status_entity_id = sensor.entity_id | replace("_container_name", "_container_status") %}
        {% set registry_entity_id = sensor.entity_id | replace("_container_name", "_docker_registry") %}
        {% set image_entity_id = sensor.entity_id | replace("_container_name", "_docker_image") %}
        {% set tag_entity_id = sensor.entity_id | replace("_container_name", "_docker_tag") %}
        {% set ports_entity_id = sensor.entity_id | replace("_container_name", "_exposed_ports") %}
        {% set update_entity_id = sensor.entity_id | replace("_container_name", "_update") %}
        
        {% set status_entity = states.sensor[status_entity_id.split('.')[1]] %}
        {% set registry_entity = states.sensor[registry_entity_id.split('.')[1]] %}
        {% set image_entity = states.sensor[image_entity_id.split('.')[1]] %}
        {% set tag_entity = states.sensor[tag_entity_id.split('.')[1]] %}
        {% set ports_entity = states.sensor[ports_entity_id.split('.')[1]] %}
        {% set update_entity = update_entity_id | replace("sensor", "update") %}
        
        {% if status_entity is defined and status_entity.state not in ['unavailable', 'unknown'] %}
          {% set container_info = {
            'type': 'entities',
            'title': container_name,
            'entities': [
              {'entity': status_entity_id, 'name': status_entity.attributes.friendly_name | replace(container_name, "")},
              {'entity': registry_entity_id, 'name': registry_entity.attributes.friendly_name | replace(container_name, "")},
              {'entity': image_entity_id, 'name': image_entity.attributes.friendly_name | replace(container_name, "")},
              {'entity': tag_entity_id, 'name': tag_entity.attributes.friendly_name | replace(container_name, "")},
              {'entity': ports_entity_id, 'name': ports_entity.attributes.friendly_name | replace(container_name, "")},
              {'entity': update_entity, 'name': "Update"}
            ]
          } %}
          {% set ns.entities = ns.entities + [container_info] %}
        {% endif %}
        
      {% endif %}
    {% endfor %} {{ ns.entities | tojson }}

image

2 Likes

One more addition, somehow when I rebuild images they get the name with “_2” added at the end. Therefore I’ve changed your regular expression to:

regex_search("sensor\..*_container_name.*$", ignorecase=True)

@pvh0 Thanks for the help :slight_smile:

My compose editor is in Portainer and mqdocker in part of a stack.

The syntax I use for the environment part is slightly different and I wonder if that could be part of the problem?

The other docker part of the stack is running fine.

Here is my redacted code :

  mqdockerup:
    image: micrib/mqdockerup:latest
    container_name: mqdockerup
    environment:
      - PUID=xxx
      - PGID=xxx
      - TZ=zone
      - MAIN_INTERVAL:5m
      - MQTT_CONNECTIONURI:mqtt://myMQTT_IP:1883
      - MQTT_USERNAME:username
      - MQTT_PASSWORD:password
#      - ACCESSTOKENS_GITHUB: ""
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock # This is required to access the docker API	
      - /volume1/docker/mqdockerup/:/app/data/ # This is required to store the data (database.db)
    network_mode: xxx
    restart: unless-stopped

My compose editor will not work without the - in front of the variables names or with quotes around the values as far as I can see.

To be clear the standalone version was installed on a computer and not on the NAS, so I suspect that is why it cannot connect to the docker.

In any case, I prefer to only use the docker if that is possible so I am hoping it is simply a configuration issue.

1 Like

I’m using the same, Portainer compose editor in a stack and have shown my code. Yours is different in several ways:

  • Version is not defined ( environment and content attributes are available with Docker Compose version 2.23.1 and later.)
  • Your environment variables start with a "- " , not sure if that matters
  • I see some undocumented variables that I do not know (e.g. PUID)
  • your values are not between double quotes (e.g. MQTT_CONNECTIONURI)

Would recommend to start a new stack to test just running the MQdockerup image in portainer with the compose coe I provided, with you password and username etc added. See also here a link for the official compose example:

2 Likes

Thanks @pvh0 I think I simply went down a rabbit hole!

Launching the compose in a separate stack whilst reviewing the syntax allowed me to fix the problem.

I’m not sure why this syntax with the “-” works with my other dockers such as sonarr, radarr, etc, but not this one.

All the same I’m up and running and already loving this service. Exactly what I needed to maintain my docker within HA :star_struck:

2 Likes

It has been working very well for me since I managed to get this running.

There are however a few containers for which I have issues.

Both tecnativa/docker-socket-proxy and plexinc/pms-docker (public tag) are reporting unknown status.

Has anybody experienced this and found a fix?
I searched but could not find references.

Cheers,

Hello,

Any news regarding restart functionality?

Thanks for the great work! I’m really looking forward to the start/stop functionality, that would make your tool complete.

Hey,

Just found this and had some issues with setting up, after a while I did manage to get it running with the “-” syntax as all my other compose containers. Just wanted to let you know that it does work, you need to follow syntax though, so replace “:” with “=” and all good.

1 Like

hi,

would really like to get this tool running on my system.
So far i’ve been able to get the container running, and I’m getting update notifications in HA over mqtt. But when i try to update containers, I simply get a error in mqdockerup logs for each an every container i try to update :confused:

06.11.2024 12:20:24 [info] 	Got update message for alexxit/go2rtc

06.11.2024 12:20:24 [info] 	Updated container

06.11.2024 12:20:24 [info] 	Checking for removed containers...

06.11.2024 12:20:24 [error] 	Pulling Error: Error: (HTTP code 403) unexpected - <html><body><h1>403 Forbidden</h1>

Request forbidden by administrative rules.

</body></html>