Unable to pull or use images from my own (or public) docker repository

Hi all, I’ve been trying to understand how to administer open nebula with our docker build pipeline process. Our repository isn’t public, and so I must do a docker login to have access to pull the images down locally, however that doesn’t make them available on open nebula. We’re on latest stable that just came out 6.8

I’ve read the docs multiple times, but I’ve not been able to wrap my head around what I’m doing wrong when using oneimage create in a terminal for using our repo images, nor have I been able to add our repo to open nebula and have it just… make our repo images available like is done with the standard dockerhub repository.

Can anyone explain what I’m doing wrong, and better yet, can someone explain how to just make this example repo of appflowyio available in open nebula to manage with the interface? Thanks.

I’ve read through Appliances and Marketplaces — OpenNebula 6.8.0 documentation multiple times and I really have no idea there is any way to do this. I’m not running my own registry, I’m just using hub.docker

Docker repository for appflowyio


Versions of the related components and OS (frontend, hypervisors, VMs):
Vsphere Hype:

  • Debian 11 VM: minione:6.8 --frontend
  • Debian 11 VM: opennebula-lxc latest stable from repo
  • Debian 11 VM: opennebula-kvm latest stable from repo

Steps to reproduce:

Try to add public repo or add a public image that is downloaded to the frontend.

I’ll use appflowyio repo as an example since it is a project I’ve been running elsewhere until I can consolidate.

root@debian:~# docker pull appflowyio/appflowy_client
Using default tag: latest
latest: Pulling from appflowyio/appflowy_client
cc3a38616e4b: Pull complete 
9d96c5160b75: Pull complete 
2789a99a9a2e: Pull complete 
5777b20efffc: Pull complete 
f5d7413d3ccb: Pull complete 
b1e806158c61: Pull complete 
92ed9a8b920c: Pull complete 
e614991f780d: Pull complete 
b16658aec5dd: Pull complete 
Digest: sha256:d16fdde63f45a3c1c9b69c94f5c8d4932dbe25c0e97c3faf960f2fbc9308bfc7
Status: Downloaded newer image for appflowyio/appflowy_client:latest
docker.io/appflowyio/appflowy_client:latest
REPOSITORY                   TAG       IMAGE ID       CREATED         SIZE
appflowyio/appflowy_client   latest    5a672fa28498   20 months ago   1.2GB
root@debian:~# oneimage create --name appflowy_client --path 'docker://appflowy_client?size=640' --datastore 1
ID: 8
root@debian:~# oneimage create --name appflowy_client2 --path 'docker://appflowyio/appflowy_client?size=640' --datastore 1
ID: 9

Current results:

Empty market places, and errors from server on import no such images exist.

errors on server:

Thu Oct 26 12:33:40 2023 : Error copying image in the datastore: INFO: cp: Copying local image docker://appflowy_client?size=640 to the image repository ERROR: cp: Command "set -e -o pipefail; /var/lib/one/remotes/datastore/fs/../downloader.sh 'docker://appflowy_client?size=640' '/var/lib/one//datastores/1/f7b425197ecd77f10eba999ae5f853be'" failed: Unable to find image 'appflowy_client:latest' locally docker: Error response from daemon: pull access denied for appflowy_client, repository does not exist or may require 'docker login': denied: requested access to the resource is denied. See 'docker run --help'. Error response from daemon: No such image: appflowy_client:latest Error response from daemon: No such image: appflowy_client:latest Error copying Error copying docker://appflowy_client?size=640 to /var/lib/one//datastores/1/f7b425197ecd77f10eba999ae5f853be	

and

Thu Oct 26 12:33:52 2023 : Error copying image in the datastore: INFO: cp: Copying local image docker://appflowyio/appflowy_client?size=640 to the image repository ERROR: cp: Command "set -e -o pipefail; /var/lib/one/remotes/datastore/fs/../downloader.sh 'docker://appflowyio/appflowy_client?size=640' '/var/lib/one//datastores/1/90c78a46b7eb90fe2eeee20cfbbbcf11'" failed: Error response from daemon: No such image: appflowyio:latest Error response from daemon: No such image: appflowyio:latest Error copying Error copying docker://appflowyio/appflowy_client?size=640 to /var/lib/one//datastores/1/90c78a46b7eb90fe2eeee20cfbbbcf11

respectively.

Expected results:

A way to have public repo and custom repo docker images available in open nebula (ideally without doing any local importing via commands as we have dozens of images we build weekly)

It is possible that the script which builds the docker image in OpenNebula is silently failing. In order to figure out what is failing, execute

bash -xv ./remotes/datastore/docker_downloader.sh 'docker://appflowyio/appflowy_client?size=640'

Yeah I don’t think the docker downloader has any support for using public or personal dockerhub repositories.

root@debian:~# docker pull appflowyio/appflowy_client
Using default tag: latest
latest: Pulling from appflowyio/appflowy_client
Digest: sha256:d16fdde63f45a3c1c9b69c94f5c8d4932dbe25c0e97c3faf960f2fbc9308bfc7
Status: Image is up to date for appflowyio/appflowy_client:latest
docker.io/appflowyio/appflowy_client:latest
root@debian:~# /var/lib/one/remotes/datastore/docker_downloader.sh docker://appflowyio/appflowy_client?size=640
Error response from daemon: No such image: appflowyio:latest
Error response from daemon: No such image: appflowyio:latest

Likewise:

root@debian:~# /var/lib/one/remotes/datastore/docker_downloader.sh docker://appflowy_client?size=640
Unable to find image 'appflowy_client:latest' locally
docker: Error response from daemon: pull access denied for appflowy_client, repository does not exist or may require 'docker login': denied: requested access to the resource is denied.
See 'docker run --help'.
Error response from daemon: No such image: appflowy_client:latest
Error response from daemon: No such image: appflowy_client:latest

From the docker agent:

REPOSITORY                   TAG       IMAGE ID       CREATED         SIZE
appflowyio/appflowy_client   latest    5a672fa28498   20 months ago   1.2GB

The docker_downloader.sh script cuts at the first /.

Further, it’d be ideal if I didn’t have to add images one at a time and if I could just target my entire repository as I have a few dozen that I use. (eg r/appfloyio) and be able to select which of the images from that repo to use.

A couple things to note

root@debian:~# /var/lib/one/remotes/datastore/docker_downloader.sh docker://appflowy_client?size=640

  • You are missing the size in the url, it is necessary for the import process
  • You should instead use docker://appflowyio/appflowy_client/size=<the_size_you_want>? for non official images download. Thanks to your post we have made this clear in the documentation.
  • When the image is created with oneimage create the downloader script is executed as the oneadmin user. So you should make sure the oneadmin user can pull your repository images.

Glad to hear it has been addressed on the size

I’m still not able to get the script to work

oneadmin@debian:~$ docker images
REPOSITORY                   TAG       IMAGE ID       CREATED         SIZE
appflowyio/appflowy_client   latest    5a672fa28498   20 months ago   1.2GB
oneadmin@debian:~$ /var/lib/one/remotes/datastore/docker_downloader.sh docker://appflowyio/appflowy_client/size=640
/var/lib/one/remotes/datastore/docker_downloader.sh: line 111: appflowyio/appflowy_client/size=640: No such file or directory
oneadmin@debian:~$ /var/lib/one/remotes/datastore/docker_downloader.sh docker://appflowy_client/size=640/var/lib/one/remotes/datastore/docker_downloader.sh: line 111: appflowy_client/size=640: No such file or directory
oneadmin@debian:~$ 

And again, Ideally I’d like to be able to just add a repository into my sunstone ui and just select which of the images to make available from there, as we have many images that are built for our labs.

Execute it like this

bash -xv /var/lib/one/remotes/datastore/docker_downloader.sh 'docker://appflowyio/appflowy_client/size=640'

this should clarify where and why it is failing.

And again, Ideally I’d like to be able to just add a repository into my sunstone ui and just select which of the images to make available from there, as we have many images that are built for our labs.

Please request a feature on the github repo. As it stands right now, DockerHub integration is only for official images as noted in the DockerHub Marketplace documentation. Hence the need for per image oneimage create.

Thanks for that. Here is the output. ( I don’t know desired or expected behavior with how this is supposed to work, so hopefully you don’t mind helping me understand)

if [[ $MARKET_URL == dockerfile* ]]; then
    url=$(echo "$MARKET_URL" | grep -oP "^"dockerfile://"\K.*")
    export_from="dockerfile"
elif [[ $MARKET_URL == docker* ]]; then
    url=$(echo "$MARKET_URL" | grep -oP "^"docker://"\K.*")
    export_from="dockerhub"
else
    echo "Unknown URL format" 1>&2
    exit 1
fi
+ [[ docker://appflowyio/appflowy_client/size=640 == dockerfile* ]]
+ [[ docker://appflowyio/appflowy_client/size=640 == docker* ]]
++ echo docker://appflowyio/appflowy_client/size=640
++ grep -oP '^docker://\K.*'
+ url=appflowyio/appflowy_client/size=640
+ export_from=dockerhub

arguments=$(echo "$url" | cut -d '?' -f 2)
++ echo appflowyio/appflowy_client/size=640
++ cut -d '?' -f 2
+ arguments=appflowyio/appflowy_client/size=640

#Create a shell variable for every argument (size=5219, format=raw...)
for p in ${arguments//&/ }; do
    kvp=( ${p/=/ } );
    k=${kvp[0]};v=${kvp[1]};
    [ -n "$k" -a -n "$v" ] && eval "$k"="$v";
done
+ for p in ${arguments//&/ }
+ kvp=(${p/=/ })
+ k=appflowyio/appflowy_client/size
+ v=640
+ '[' -n appflowyio/appflowy_client/size -a -n 640 ']'
+ eval appflowyio/appflowy_client/size=640
appflowyio/appflowy_client/size=640
++ appflowyio/appflowy_client/size=640
/var/lib/one/remotes/datastore/docker_downloader.sh: line 111: appflowyio/appflowy_client/size=640: No such file or directory

Thanks, will do. I wasn’t sure if I was misunderstanding the documentation, and the feature was there - except I didn’t understand how it is supposed to work, or what the issue was. I read the documentation as the default docker marketplace only had support for the official images. I was hoping one of the other marketplaces would just apply the same functionality to one you add yourself. Appreciate clarification the feature doesn’t exist right now.

try using? instead of / when specifying size

docker://appflowyio/appflowy_client?size=640

Thanks. I was using the /size because that is what you mentioned should be done in an earlier post.

here is the result from using ?size instead:

oneadmin@debian:~$ /var/lib/one/remotes/datastore/docker_downloader.sh docker://appflowy_client?size=640
Unable to find image 'appflowy_client:latest' locally
docker: Error response from daemon: pull access denied for appflowy_client, repository does not exist or may require 'docker login': denied: requested access to the resource is denied.
See 'docker run --help'.
Error response from daemon: No such image: appflowy_client:latest
Error response from daemon: No such image: appflowy_client:latest
oneadmin@debian:~$ /var/lib/one/remotes/datastore/docker_downloader.sh docker://appflowyio/appflowy_client?size=640
Error response from daemon: No such image: appflowyio:latest
Error response from daemon: No such image: appflowyio:latest
oneadmin@debian:~$ 

bash -xv /var/lib/one/remotes/datastore/docker_downloader.sh 'docker://appflowyio/appflowy_client?size=640'

#-------------------------------------------------------------------------------
# Parse downloader URL
#-------------------------------------------------------------------------------
#  URL is in the form
#  docker://<container_name>?size=&filesystem=&format=&distro=&tag=
#  dockerfile://<path_to_file>?size=&filesystem=&format=&distro=
#  dockerfile://?fileb64=&size=&filesystem=&format=&distro=
#
#  container_name: As listed in docker hub. e.g. alpine
#  size: in MB for the resulting image
#  filesystem: filesystem type e.g. ext4
#  format: image format e.g. raw or qcow2
#  distro: base image distro to install contents
#  tag: one of the image supported tags
#  fileb64: dockerfile in base 64
#  context: yes to generate image with context packages, falso otherwise
#-------------------------------------------------------------------------------

if [[ $MARKET_URL == dockerfile* ]]; then
    url=$(echo "$MARKET_URL" | grep -oP "^"dockerfile://"\K.*")
    export_from="dockerfile"
elif [[ $MARKET_URL == docker* ]]; then
    url=$(echo "$MARKET_URL" | grep -oP "^"docker://"\K.*")
    export_from="dockerhub"
else
    echo "Unknown URL format" 1>&2
    exit 1
fi
+ [[ docker://appflowyio/appflowy_client?size=640 == dockerfile* ]]
+ [[ docker://appflowyio/appflowy_client?size=640 == docker* ]]
++ echo 'docker://appflowyio/appflowy_client?size=640'
++ grep -oP '^docker://\K.*'
+ url='appflowyio/appflowy_client?size=640'
+ export_from=dockerhub

arguments=$(echo "$url" | cut -d '?' -f 2)
++ echo 'appflowyio/appflowy_client?size=640'
++ cut -d '?' -f 2
+ arguments=size=640

#Create a shell variable for every argument (size=5219, format=raw...)
for p in ${arguments//&/ }; do
    kvp=( ${p/=/ } );
    k=${kvp[0]};v=${kvp[1]};
    [ -n "$k" -a -n "$v" ] && eval "$k"="$v";
done
+ for p in ${arguments//&/ }
+ kvp=(${p/=/ })
+ k=size
+ v=640
+ '[' -n size -a -n 640 ']'
+ eval size=640
size=640
++ size=640

if [ -z "$tag" ]; then
    tag="latest"
fi
+ '[' -z '' ']'
+ tag=latest

dockerdir="$TMP_DIR/$id"
+ dockerdir=/var/tmp/30075-27863-9249-25871-25042
dockerfile="$dockerdir/dockerfile"
+ dockerfile=/var/tmp/30075-27863-9249-25871-25042/dockerfile
tarball="$dockerdir/fs.tar"
+ tarball=/var/tmp/30075-27863-9249-25871-25042/fs.tar
img_raw="$dockerdir/img.raw"
+ img_raw=/var/tmp/30075-27863-9249-25871-25042/img.raw
img_qcow="$dockerdir/img.qcow"
+ img_qcow=/var/tmp/30075-27863-9249-25871-25042/img.qcow

# Trap for cleaning temporary directories
trap clean EXIT && trap clean ERR
+ trap clean EXIT
+ trap clean ERR

mkdir -p "$dockerdir"
+ mkdir -p /var/tmp/30075-27863-9249-25871-25042
mkdir -p "$dockerdir/mnt"
+ mkdir -p /var/tmp/30075-27863-9249-25871-25042/mnt

cp -rL "$CONTEXT_PATH" "$dockerdir"
+ cp -rL /usr/share/one/context /var/tmp/30075-27863-9249-25871-25042

if [ $export_from == "dockerhub" ]; then
    docker_hub=$(echo "$url" | cut -d '?' -f 1):"$tag"
    extra=''
else
    if [ -z "$fileb64" ]; then
        # Dockerfile is a path in the server
        d_file=$(echo "$url" | cut -d '?' -f 1)

        if [ -f "$d_file" ]; then
            extra=$(cat "$d_file")
        else
            echo "$d_file does not exist" 1>&2
            exit 1
        fi
    else
        # Dockerfile is encoded in base64
        extra=$(echo "$fileb64" | base64 -d)
    fi

    # Read image that needs to be build
    docker_hub=$(echo "$extra" | grep "^FROM" | cut -d ' ' -f2)

    if [ -z "$docker_hub" ]; then
        echo "Can\'t identify image to build" 1>&2
        exit 1
    fi

    # Remove FROM instruction from dockerfile as it will be added later
    extra=$(echo "$extra" | sed '/^FROM.*/d')
fi
+ '[' dockerhub == dockerhub ']'
++ echo 'appflowyio/appflowy_client?size=640'
++ cut -d '?' -f 1
+ docker_hub=appflowyio/appflowy_client:latest
+ extra=

# Check distro
if [ -z "$distro" ]; then
    os_info=$(docker run --rm --entrypoint cat \
        -e "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" \
        "$docker_hub" /etc/os-release)

    distro=$(echo "$os_info" | grep "^ID=" | cut -d= -f 2 | xargs)
    version=$(echo "$os_info" | grep "VERSION_ID=" | cut -d= -f 2 | xargs)
fi
+ '[' -z '' ']'
++ docker run --rm --entrypoint cat -e PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin appflowyio/appflowy_client:latest /etc/os-release
+ os_info='NAME="Arch Linux"
PRETTY_NAME="Arch Linux"
ID=arch
BUILD_ID=rolling
ANSI_COLOR="38;2;23;147;209"
HOME_URL="https://archlinux.org/"
DOCUMENTATION_URL="https://wiki.archlinux.org/"
SUPPORT_URL="https://bbs.archlinux.org/"
BUG_REPORT_URL="https://bugs.archlinux.org/"
LOGO=archlinux-logo'
++ echo 'NAME="Arch Linux"
PRETTY_NAME="Arch Linux"
ID=arch
BUILD_ID=rolling
ANSI_COLOR="38;2;23;147;209"
HOME_URL="https://archlinux.org/"
DOCUMENTATION_URL="https://wiki.archlinux.org/"
SUPPORT_URL="https://bbs.archlinux.org/"
BUG_REPORT_URL="https://bugs.archlinux.org/"
LOGO=archlinux-logo'
++ grep '^ID='
++ cut -d= -f 2
++ xargs
+ distro=arch
++ echo 'NAME="Arch Linux"
PRETTY_NAME="Arch Linux"
ID=arch
BUILD_ID=rolling
ANSI_COLOR="38;2;23;147;209"
HOME_URL="https://archlinux.org/"
DOCUMENTATION_URL="https://wiki.archlinux.org/"
SUPPORT_URL="https://bbs.archlinux.org/"
BUG_REPORT_URL="https://bugs.archlinux.org/"
LOGO=archlinux-logo'
++ grep VERSION_ID=
++ cut -d= -f 2
++ xargs
+ version=
clean
++ clean
++ docker rm -f ''
++ true
++ '[' -n appflowyio ']'
++ docker rmi -f appflowyio
Error response from daemon: No such image: appflowyio:latest
++ docker image rm -f one30075
++ rm -rf /var/tmp/30075-27863-9249-25871-25042
clean
+ clean
+ docker rm -f ''
+ true
+ '[' -n appflowyio ']'
+ docker rmi -f appflowyio
Error response from daemon: No such image: appflowyio:latest
+ docker image rm -f one30075
+ rm -rf /var/tmp/30075-27863-9249-25871-25042

and: bash -xv /var/lib/one/remotes/datastore/docker_downloader.sh 'docker://appflowy_client?size=640'

# Parse downloader URL
#-------------------------------------------------------------------------------
#  URL is in the form
#  docker://<container_name>?size=&filesystem=&format=&distro=&tag=
#  dockerfile://<path_to_file>?size=&filesystem=&format=&distro=
#  dockerfile://?fileb64=&size=&filesystem=&format=&distro=
#
#  container_name: As listed in docker hub. e.g. alpine
#  size: in MB for the resulting image
#  filesystem: filesystem type e.g. ext4
#  format: image format e.g. raw or qcow2
#  distro: base image distro to install contents
#  tag: one of the image supported tags
#  fileb64: dockerfile in base 64
#  context: yes to generate image with context packages, falso otherwise
#-------------------------------------------------------------------------------

if [[ $MARKET_URL == dockerfile* ]]; then
    url=$(echo "$MARKET_URL" | grep -oP "^"dockerfile://"\K.*")
    export_from="dockerfile"
elif [[ $MARKET_URL == docker* ]]; then
    url=$(echo "$MARKET_URL" | grep -oP "^"docker://"\K.*")
    export_from="dockerhub"
else
    echo "Unknown URL format" 1>&2
    exit 1
fi
+ [[ docker://appflowy_client?size=640 == dockerfile* ]]
+ [[ docker://appflowy_client?size=640 == docker* ]]
++ echo 'docker://appflowy_client?size=640'
++ grep -oP '^docker://\K.*'
+ url='appflowy_client?size=640'
+ export_from=dockerhub

arguments=$(echo "$url" | cut -d '?' -f 2)
++ echo 'appflowy_client?size=640'
++ cut -d '?' -f 2
+ arguments=size=640

#Create a shell variable for every argument (size=5219, format=raw...)
for p in ${arguments//&/ }; do
    kvp=( ${p/=/ } );
    k=${kvp[0]};v=${kvp[1]};
    [ -n "$k" -a -n "$v" ] && eval "$k"="$v";
done
+ for p in ${arguments//&/ }
+ kvp=(${p/=/ })
+ k=size
+ v=640
+ '[' -n size -a -n 640 ']'
+ eval size=640
size=640
++ size=640

if [ -z "$tag" ]; then
    tag="latest"
fi
+ '[' -z '' ']'
+ tag=latest

dockerdir="$TMP_DIR/$id"
+ dockerdir=/var/tmp/24562-15342-29264-323-14504
dockerfile="$dockerdir/dockerfile"
+ dockerfile=/var/tmp/24562-15342-29264-323-14504/dockerfile
tarball="$dockerdir/fs.tar"
+ tarball=/var/tmp/24562-15342-29264-323-14504/fs.tar
img_raw="$dockerdir/img.raw"
+ img_raw=/var/tmp/24562-15342-29264-323-14504/img.raw
img_qcow="$dockerdir/img.qcow"
+ img_qcow=/var/tmp/24562-15342-29264-323-14504/img.qcow

# Trap for cleaning temporary directories
trap clean EXIT && trap clean ERR
+ trap clean EXIT
+ trap clean ERR

mkdir -p "$dockerdir"
+ mkdir -p /var/tmp/24562-15342-29264-323-14504
mkdir -p "$dockerdir/mnt"
+ mkdir -p /var/tmp/24562-15342-29264-323-14504/mnt

cp -rL "$CONTEXT_PATH" "$dockerdir"
+ cp -rL /usr/share/one/context /var/tmp/24562-15342-29264-323-14504

if [ $export_from == "dockerhub" ]; then
    docker_hub=$(echo "$url" | cut -d '?' -f 1):"$tag"
    extra=''
else
    if [ -z "$fileb64" ]; then
        # Dockerfile is a path in the server
        d_file=$(echo "$url" | cut -d '?' -f 1)

        if [ -f "$d_file" ]; then
            extra=$(cat "$d_file")
        else
            echo "$d_file does not exist" 1>&2
            exit 1
        fi
    else
        # Dockerfile is encoded in base64
        extra=$(echo "$fileb64" | base64 -d)
    fi

    # Read image that needs to be build
    docker_hub=$(echo "$extra" | grep "^FROM" | cut -d ' ' -f2)

    if [ -z "$docker_hub" ]; then
        echo "Can\'t identify image to build" 1>&2
        exit 1
    fi

    # Remove FROM instruction from dockerfile as it will be added later
    extra=$(echo "$extra" | sed '/^FROM.*/d')
fi
+ '[' dockerhub == dockerhub ']'
++ echo 'appflowy_client?size=640'
++ cut -d '?' -f 1
+ docker_hub=appflowy_client:latest
+ extra=

# Check distro
if [ -z "$distro" ]; then
    os_info=$(docker run --rm --entrypoint cat \
        -e "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" \
        "$docker_hub" /etc/os-release)

    distro=$(echo "$os_info" | grep "^ID=" | cut -d= -f 2 | xargs)
    version=$(echo "$os_info" | grep "VERSION_ID=" | cut -d= -f 2 | xargs)
fi
+ '[' -z '' ']'
++ docker run --rm --entrypoint cat -e PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin appflowy_client:latest /etc/os-release
Unable to find image 'appflowy_client:latest' locally
docker: Error response from daemon: pull access denied for appflowy_client, repository does not exist or may require 'docker login': denied: requested access to the resource is denied.
See 'docker run --help'.
+ os_info=
clean
++ clean
++ docker rm -f ''
++ true
++ '[' -n appflowy_client ']'
++ docker rmi -f appflowy_client
Error response from daemon: No such image: appflowy_client:latest
++ docker image rm -f one24562
++ rm -rf /var/tmp/24562-15342-29264-323-14504
clean
+ clean
+ docker rm -f ''
+ true
+ '[' -n appflowy_client ']'
+ docker rmi -f appflowy_client
Error response from daemon: No such image: appflowy_client:latest
+ docker image rm -f one24562
+ rm -rf /var/tmp/24562-15342-29264-323-14504

I can run cat /etc/os-release myself with this command:

oneadmin@debian:~$ docker run appflowyio/appflowy_client cat /etc/os-release
NAME="Arch Linux"
PRETTY_NAME="Arch Linux"
ID=arch
BUILD_ID=rolling
ANSI_COLOR="38;2;23;147;209"
HOME_URL="https://archlinux.org/"
DOCUMENTATION_URL="https://wiki.archlinux.org/"
SUPPORT_URL="https://bbs.archlinux.org/"
BUG_REPORT_URL="https://bugs.archlinux.org/"
LOGO=archlinux-logo

This is the semi-correct usage of the URL. As you can see there are no more docker login problems and no more complains about pulling your app (although it fails in the cleanup, this is getting fixed already thanks to your post) but there is still an error.

The cause seems to be ArchLinux being an unhandled distro and your app using it. The problem is that the script looks for VERSION_ID in the /etc/os-release file

version=$(echo "$os_info" | grep "VERSION_ID=" | cut -d= -f 2 | xargs)

and Arch being rolling release it doesn’t have that, thus the command fails and triggers the cleanup functionality, which also fails (the bug I mentioned before) and the error you see on your end is this cleanup error, not the real error.

While this case (distros without VERSION_ID) can be improved to prevent errors, you can skip this problem by issuing the distro URL argument. If you take a look at the warning in the non official images download section you can see a hint to that.

So you can then use the url docker://appflowyio/appflowy_client?size=640&distro=arch. This one should work.