# How to deploy application containers
`swmodd` support deployment of application containers which support OCI image and runtime formats using CRUN.

## How to create an application container tar
To convert an docker image to OCI application container, we need to use `skopeo` and `umoci` utilities.

In below exaple [httpd](https://hub.docker.com/_/httpd) docker container is used
- Create an empty directory in local laptop/desktop
```bash
$ mkdir lcm
$ cd lcm
```
- Copy the docker image using skopeo, make sure to use correct tag as per the target architecture
```bash
$ skopeo copy docker://httpd:latest oci:httpd_copy:latest
```
- Unpack the downloaded image in OCI format using umoci
```bash
$ sudo -i
# cd <working_dir_path>
# umoci unpack --image httpd_copy:latest httpd
```
- Move to the directory containing config.json and rootfs and create a tar
```bash
# cd httpd
# tar cf ../httpd.tar *
```

- Use this tar in `install_du` ubus command to deploy the application container

## Sulu application container
An example makefile to generate sulu application container tar ball can be accessed [here](https://dev.iopsys.eu/iopsys/swmodd/-/blob/devel/examples/sulu/README.md)

## Local application containers with multi-arch support
It is possible to create an multi-arch oci container and store it in Gitlab image registry, to support variety of devices and platforms.

This can be done in many ways, but in this example I am using docker buildx to build multi-arch containers.

### Pre-setup

1. Create a access-token with read/write access to image registry in gitlab
2. Install buildx

```bash
export BUILDX_VERSION="v0.10.4"
export BUILDX_ARCH="linux-amd64"
wget -O /usr/bin/docker-buildx https://github.com/docker/buildx/releases/download/${BUILDX_VERSION}/buildx-${BUILDX_VERSION}.${BUILDX_ARCH}
```

### Build
To build a multi-arch oci container and push to Gitlab image registry, run following commands, sulu example container used in this example:

```bash
$ docker-buildx create --use
$ cd examples/sulu
$ make extract
$ docker-buildx build --provenance=false --platform linux/386,linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64/v8 --tag dev.iopsys.eu:5050/lcm/swmodd/sulu:v2.1.2 --push .
```

Above commands creates sulu multi-arch containers and push it to Gitlab [image registry](https://dev.iopsys.eu/lcm/swmodd/container_registry/).

### Verify
Image details can be verified with docker manifest command:

```bash
vdutta@SW019:~$ docker manifest inspect dev.iopsys.eu:5050/lcm/swmodd/sulu
{
   "schemaVersion": 2,
   "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
   "manifests": [
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 1871,
         "digest": "sha256:5d362624ae3d27ecea7486a6b8f6a103b7d52543574baa483dd9034402727eb5",
         "platform": {
            "architecture": "386",
            "os": "linux"
         }
      },
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 1871,
         "digest": "sha256:db776d064d0763874bca5f8c4a5f396e339a901350cbcc8714c5e19c3adcefc9",
         "platform": {
            "architecture": "amd64",
            "os": "linux"
         }
      },
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 1871,
         "digest": "sha256:0323e482ca40f631a46993736b65459554149ac1586f04042cf61e738236bc64",
         "platform": {
            "architecture": "arm",
            "os": "linux",
            "variant": "v5"
         }
      },
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 1871,
         "digest": "sha256:63d6bcea175828b4a8034b874948e774e40eea8f71657c6e0d7a4d5881662db8",
         "platform": {
            "architecture": "arm",
            "os": "linux",
            "variant": "v6"
         }
      },
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 1871,
         "digest": "sha256:29152f374de66400c489413c2fcddfd26b8edad4c048efea57b0c17f07aa05ed",
         "platform": {
            "architecture": "arm",
            "os": "linux",
            "variant": "v7"
         }
      }
   ]
}
vdutta@SW019:~$
```

Above output provides the sha1 hash per architechture, to use a specific image in device, it can be used with its sha checksum hash, like below

```bash
obuspa -c operate "Device.SoftwareModules.InstallDU(URL=docker://dev.iopsys.eu:5050/lcm/swmodd/sulu@sha256:0323e482ca40f631a46993736b65459554149ac1586f04042cf61e738236bc64)"
```

This installs sulu for arm/v5 arch.