Mender Update installation

I am installing mender on my machine for OTA updates and app deployments.

Installing mender using

curl -fLsS https://get.mender.io -o get-mender.sh
# Added mender update component to instal list
sudo bash get-mender.sh

This did not work giving some version mismatch error

Then I installed mender-clinet4 which had the mender-update component,

mender-update --version
5.0.3

but it did not have the docker compose module as mentioned here. Tutorial: Docker Compose update | Mender documentation

I installed all these components on my machine and I got some error regarding missing files in modules.

2025-11-05 13:27:46.984 +0000 UTC info: Running Mender client 5.0.3
2025-11-05 13:27:46.984 +0000 UTC info: Deployment with ID 06ff1ec7-1a36-47df-898f-fa18944987ea started.
2025-11-05 13:27:46.985 +0000 UTC info: Sending status update to server
2025-11-05 13:27:47.47 +0000 UTC info: Installing artifact...
2025-11-05 13:27:47.487 +0000 UTC error: Update Module not found for given artifact type: ProvidePayloadFileSizes: Cannot launch /usr/share/mender/modules/v3/docker-compose
2025-11-05 13:27:47.487 +0000 UTC error: Operation canceled: GET https://c271964d41749feb10da762816c952ee.r2.cloudflarestorage.com/mender-artifact-storage-prod-hm-eu/68e7a4b6c3561b4d9787dfde/bdb6aeed-c1a8-4a67-96cd-187555340519?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=19a52e042b2d44cda3cce7623fc49194%2F20251105%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20251105T132746Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B%20filename%3D%22nginx-v1.0.mender%22&response-content-type=application%2Fvnd.mender-artifact&x-id=GetObject&X-Amz-Signature=f8693457496da67bd05dcd97d0106710e2bb664a114b099b06f97af7218906cf: HTTP request cancelled
2025-11-05 13:27:47.49 +0000 UTC error: Update Module not found for given artifact type: Cleanup: Cannot launch /usr/share/mender/modules/v3/docker-compose
2025-11-05 13:27:47.49 +0000 UTC info: Sending status update to server

I copied usr/share/mender/app-modules/v1/docker-compose to usr/share/mender/modules/v3/docker-compose

Now i get the following error

2025-11-05 14:43:46.076 +0000 UTC info: Running Mender client 5.0.3
2025-11-05 14:43:46.076 +0000 UTC info: Deployment with ID ff947dc1-ab34-42c6-8b9f-90680dc88a7e started.
2025-11-05 14:43:46.077 +0000 UTC info: Sending status update to server
2025-11-05 14:43:46.424 +0000 UTC info: Installing artifact...
2025-11-05 14:43:46.447 +0000 UTC error: Process returned non-zero exit status: ProvidePayloadFileSizes: Process exited with status 1
2025-11-05 14:43:46.448 +0000 UTC error: Operation canceled: GET https://c271964d41749feb10da762816c952ee.r2.cloudflarestorage.com/mender-artifact-storage-prod-hm-eu/68e7a4b6c3561b4d9787dfde/bdb6aeed-c1a8-4a67-96cd-187555340519?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=19a52e042b2d44cda3cce7623fc49194%2F20251105%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20251105T144346Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B%20filename%3D%22nginx-v1.0.mender%22&response-content-type=application%2Fvnd.mender-artifact&x-id=GetObject&X-Amz-Signature=a77bebfa7bf180b975fbd1da4b6e1d180df02e31da6caa56242243b69352436d: HTTP request cancelled
2025-11-05 14:43:46.454 +0000 UTC info: Update Module output (stdout): ERROR: unknown API call: Cleanup /var/lib/mender/modules/v3/payloads/0000/tree
2025-11-05 14:43:46.456 +0000 UTC error: Process returned non-zero exit status: Cleanup: Process exited with status 1
2025-11-05 14:43:46.456 +0000 UTC info: Sending status update to server

I tried creating the artifact as both app and docker-compose.

mender-artifact write module-image   -T app   -n ${ARTIFACT_NAME}   -t ${DEVICE_TYPE}   -o ${OUTPUT_PATH}   -f docker-compose.yml
mender-artifact write module-image   -T docker-compose   -n ${ARTIFACT_NAME}   -t ${DEVICE_TYPE}   -o ${OUTPUT_PATH}   -f docker-compose.yml

Is there a documentation on how to get the whole pipeline working?

Installation Guide used

Im trying to use the docker artifact gen I m not sure if this is the latest method of doing this. As per the tutorial it uses a differnet component.

I am trting to run docker containers in my remote machine and i unable to create artifacts

vini@vini-ThinkPad-T490s:~/artifacts$ DOCKER_IMAGES="nginx:latest curlimages/curl:latest"
vini@vini-ThinkPad-T490s:~/artifacts$ ./docker-artifact-gen -n ${ARTIFACT_NAME} -t ${DEVICE_TYPE} -o ${OUTPUT_PATH} ${DOCKER_IMAGES}
latest: Pulling from library/nginx
Digest: sha256:1beed3ca46acebe9d3fb62e9067f03d05d5bfa97a00f30938a0a3580563272ad
Status: Image is up to date for nginx:latest
docker.io/library/nginx:latest
template parsing error: template: :1:2: executing "" at <index .RepoDigests 0>: error calling index: reflect: slice index out of range
vini@vini-ThinkPad-T490s:~/artifacts$ 

When i try the method from the tutorial i get this error

vini@vini-ThinkPad-T490s:~/artifacts$ app-gen --artifact-name nginx \
        --device-type jetson \
        --application-name nginx \
        --platform "$PLATFORM" \
        --orchestrator docker-compose \
        --manifests-dir . \
        --output-path nginx-app.mender \
        -- \
        --software-name="nginx-software" \
        --software-version="software-version"
No specific images specified. Will try to extract from docker-compose.yaml file.
latest: Pulling from library/nginx
Digest: sha256:1beed3ca46acebe9d3fb62e9067f03d05d5bfa97a00f30938a0a3580563272ad
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
latest: Pulling from library/nginx
Digest: sha256:1beed3ca46acebe9d3fb62e9067f03d05d5bfa97a00f30938a0a3580563272ad
Status: Image is up to date for nginx:latest
docker.io/library/nginx:latest
declare -a images_shas=([0]="2d05a13eb7a31ad3d73ae48fce313eaa05b7c5a582eafb9c288b0f8c68e93073" [1]="2d05a13eb7a31ad3d73ae48fce313eaa05b7c5a582eafb9c288b0f8c68e93073")
failed to save image: invalid output path: directory "/tmp/tmp.6tjKfbH4IH/images/2d05a13eb7a31ad3d73ae48fce313eaa05b7c5a582eafb9c288b0f8c68e93073" does not exist

What am i missing from the documentation to get it working?
For instance single file generation works fine.

vini@vini-ThinkPad-T490s:~/artifacts$ ./single-file-artifact-gen   --device-type jetson   -o test.mender   -n test-file-jetson   --dest-dir /data   test
Artifact test.mender generated successfully:
Reading Artifact...
.............................................................. - 100 %
Mender artifact:
  Name: test-file-jetson
  Format: mender
  Version: 3
  Signature: no signature
  Compatible devices: '[jetson]'
  Provides group: 
  Depends on one of artifact(s): []
  Depends on one of group(s): []
  State scripts:

Updates:
    0:
    Type:   single-file
    Provides:
	rootfs-image.single-file.version: test-file-jetson
    Depends: Nothing
    Clears Provides: ["rootfs-image.single-file.*"]
    Metadata: Nothing
    Files:
      name:     dest_dir
      size:     6
      modified: 2025-11-07 12:42:08 +0100 CET
      checksum: 263aca83a3ff2cd846024109381a9112b546729acbcc38b9c2296fd512aea02c
      name:     filename
      size:     5
      modified: 2025-11-07 12:42:08 +0100 CET
      checksum: f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2
      name:     permissions
      size:     4
      modified: 2025-11-07 12:42:08 +0100 CET
      checksum: af5a86efbcdf0dc2cdba643a99528c6ab92cfc7ead17d655b3f63b841d74efb7
      name:     test
      size:     16
      modified: 2025-11-07 12:36:33 +0100 CET
      checksum: ed2814f4f0ee1f2f3f1277bbe43294067ffee735a3408d233bd40690c4be1aa1

Versions

mender-artifact version 3.6.0+ds1-2ubuntu0.1
Device
mender-update --version
5.0.3

I want to add dockercompose to my remote machine to run containers

thank you

Hi @vini,

I tried to reproduce your problem, but failed. Once for docker:

tyj@tyj-mmc:~/builds/docker-compose$ DOCKER_IMAGES="nginx:latest curlimages/curl:latest"
tyj@tyj-mmc:~/builds/docker-compose$ docker-artifact-gen -n ${ARTIFACT_NAME} -t ${DEVICE_TYPE} -o ${OUTPUT_PATH} ${DOCKER_IMAGES}
latest: Pulling from curlimages/curl
2d35ebdb57d9: Already exists
f2f82549a04b: Pull complete
bd9ddc54bea9: Pull complete
Digest: sha256:935d9100e9ba842cdb060de42472c7ca90cfe9a7c96e4dacb55e79e560b3ff40
Status: Downloaded newer image for curlimages/curl:latest
docker.io/curlimages/curl:latest
Writing Artifact...
Version                 _
Manifest                _
Manifest signature      _
Header                  _
Payload
Artifact nginx:latest generated successfully:
Reading Artifact...
.............................................................. - 100 %                                                                                     Mender Artifact:
  Name: myfirstcomposition
  Format: mender
  Version: 3
  Signature: no signature
  Compatible devices: [raspberrypi4]
  Provides group:
  Depends on one of artifact(s): []
  Depends on one of group(s): []
  State scripts: []

Updates:
  - Type: docker
    Provides:
      rootfs-image.docker.version: myfirstcomposition
    Depends: {}
    Clears Provides: [rootfs-image.docker.*]
    Metadata:
      {
        "containers": [
          "curlimages/curl@sha256:935d9100e9ba842cdb060de42472c7ca90cfe9a7c96e4dacb55e79e560b3ff40"
        ],
        "run_args": ""
      }
    Files: []

once for docker-compose:

tyj@tyj-mmc:~/builds/docker-compose$ app-gen --artifact-name nginx         --device-type jetson         --application-name nginx         -15:55:44 [28/475$
ORM"         --orchestrator docker-compose         --manifests-dir ./manifests/v1/         --output-path nginx-app.mender         --         --software-nam
e="nginx-software"         --software-version="software-version"
No specific images specified. Will try to extract from docker-compose.yaml file.
WARN[0000] /home/tyj/builds/docker-compose/manifests/v1/docker-compose.yaml: the attribute `version` is obsolete, it will be ignored, please remove it to a
void potential confusion
v2.9: Pulling from library/traefik
Digest: sha256:8d81a9df1435f9f3d36ac9398465ef2d5d61e671059974db753faaed14b627de
Status: Image is up to date for traefik:v2.9
docker.io/library/traefik:v2.9
v2.9: Pulling from library/traefik
Digest: sha256:8d81a9df1435f9f3d36ac9398465ef2d5d61e671059974db753faaed14b627de
Status: Image is up to date for traefik:v2.9
docker.io/library/traefik:v2.9
Using default tag: latest
latest: Pulling from traefik/whoami
Digest: sha256:200689790a0a0ea48ca45992e0450bc26ccab5307375b41c84dfc4f2475937ab
Status: Image is up to date for traefik/whoami:latest
docker.io/traefik/whoami:latest
Using default tag: latest
latest: Pulling from traefik/whoami
Digest: sha256:200689790a0a0ea48ca45992e0450bc26ccab5307375b41c84dfc4f2475937ab
Status: Image is up to date for traefik/whoami:latest
docker.io/traefik/whoami:latest
declare -a images_shas=([0]="66c077549480f6828d39797ca3855e6299d0c1e7daf08d67cd62320c07515ff0" [1]="66c077549480f6828d39797ca3855e6299d0c1e7daf08d67cd62320
c07515ff0" [2]="27e7f42650616521d8c642b93c1cbc15d503d87ef0ff4348b0156f41bf4ffd43" [3]="27e7f42650616521d8c642b93c1cbc15d503d87ef0ff4348b0156f41bf4ffd43")
images/
images/27e7f42650616521d8c642b93c1cbc15d503d87ef0ff4348b0156f41bf4ffd43/
images/27e7f42650616521d8c642b93c1cbc15d503d87ef0ff4348b0156f41bf4ffd43/image.img
images/27e7f42650616521d8c642b93c1cbc15d503d87ef0ff4348b0156f41bf4ffd43/sums-new.txt
images/27e7f42650616521d8c642b93c1cbc15d503d87ef0ff4348b0156f41bf4ffd43/sums-current.txt
images/27e7f42650616521d8c642b93c1cbc15d503d87ef0ff4348b0156f41bf4ffd43/url-current.txt
images/27e7f42650616521d8c642b93c1cbc15d503d87ef0ff4348b0156f41bf4ffd43/url-new.txt
images/66c077549480f6828d39797ca3855e6299d0c1e7daf08d67cd62320c07515ff0/
images/66c077549480f6828d39797ca3855e6299d0c1e7daf08d67cd62320c07515ff0/image.img
images/66c077549480f6828d39797ca3855e6299d0c1e7daf08d67cd62320c07515ff0/sums-new.txt
images/66c077549480f6828d39797ca3855e6299d0c1e7daf08d67cd62320c07515ff0/sums-current.txt
images/66c077549480f6828d39797ca3855e6299d0c1e7daf08d67cd62320c07515ff0/url-current.txt
images/66c077549480f6828d39797ca3855e6299d0c1e7daf08d67cd62320c07515ff0/url-new.txt
manifests/
manifests/docker-compose.yaml
saving metadata:
--
{"application_name":"nginx","orchestrator":"docker-compose","platform":"linux/arm/v7","version":"1.0","images":["27e7f42650616521d8c642b93c1cbc15d503d87ef0ff4348b0156f41bf4ffd43","66c077549480f6828d39797ca3855e6299d0c1e7daf08d67cd62320c07515ff0"]}
--
Writing Artifact...
Version                 _
Manifest                _
Manifest signature      _
Header                  _
Payload
.............................................................. - 100 %
.............................................................. - 100 %
Artifact nginx-app.mender generated successfully:
Reading Artifact...
.............................................................. - 100 %
Mender Artifact:
  Name: nginx
  Format: mender
  Version: 3
  Signature: no signature
  Compatible devices: [jetson]
  Provides group:
  Depends on one of artifact(s): []
  Depends on one of group(s): []
  State scripts: []

Updates:
  - Type: app
    Provides:
      rootfs-image.nginx-software.version: software-version
    Depends: {}
    Clears Provides: [rootfs-image.nginx-software.*]
    Metadata:
      {
        "application_name": "nginx",
        "images": [
          "27e7f42650616521d8c642b93c1cbc15d503d87ef0ff4348b0156f41bf4ffd43",
          "66c077549480f6828d39797ca3855e6299d0c1e7daf08d67cd62320c07515ff0"
        ],
        "orchestrator": "docker-compose",
        "platform": "linux/arm/v7",
        "version": "1.0"
      }
    Files:
      - checksum: 55f25f4385a23c68891ebd7d3cb8a08959e4af31ab087b7465f923b9e8899746
        modified: 2025-11-07 15:54:06 +0000 UTC
        name: images.tar.gz
        size: 39078163
      - checksum: 9d2931224ef35e90786c9728a4997e60443fc3d634ac6e3a2860c9c5e01aba1a
        modified: 2025-11-07 15:54:06 +0000 UTC
        name: manifests.tar.gz
        size: 392

You don’t need the Mender Client on the workstation.
My mender-artifact version is 4.2.0.

So the obvious things are

  1. update mender-artifact as described in Download | Mender documentation
  2. inspect your manifest file for errors, maybe start with the provided one for reference and then modify

Greetz,
Josef

Hi Josef,

thanks for checking this out.

I have upgraded the mender-artifact to 4.2.0

I still have the same error with both docker compose and docker gen. I am following the tutorial link as it is.

However I was able to create the artifact using mender-artifact command and when creating a release a container was started in my device

mender-artifact write module-image   -t jetson   -n  triton-23 -T docker -o triton-23.mender -m triton-metadata.json

cat triton-metadata.json
{
  "containers": ["nvcr.io/nvidia/tritonserver:23.10-py3"],
  "run_args": "--name tritonserver-new --runtime=nvidia --gpus all -p 9000:8000 -p 9001:8001 -p 9002:8002 --shm-size=1g --ulimit memlock=-1 --ulimit stack=67108864 -e MODEL_REPOSITORY=s3://my-bucket/models -e TRITON_AWS_MOUNT_DIRECTORY=/models --network host"
}

I m not sure how to make this part work with docker-compose though.