Frequently Asked Questions (FAQ)

How to access EdgeScale?

  1. Request an account from and get user/passwd.

  2. Access EdgeScale by one of the following ways:

    EdgeScale provides user dashboard, command line tool and Restful APIs for interactions.

    Dashboard: Sign-in

    Command line tool: escli,

    Restful APIs:

  3. A typical workflow for the user would be as follows:


I have a container app. How to deploy it to my device?

Push your container image to and get the URL link. You can also push your container image to EdgeScale with escli tool.

Register the app at AppStore and link the image URL with the app. It will be put on MyApps.

Deploy the app from MyApps, follow the process to select your device and deploy.

Check the deploy result from Task -> My Task on the left panel and click the task item.

I have a system image. How to deploy it to my device?

Push your system image on some storage site like AWS s3 and get the URL link. You can also upload your system image to EdgeScale with dashboard.

Register the systerm image at Solution store and link the image URL with the solution. It will be put on Solution store as a private image.

Deploy the image from Solution store, follow the process to select your device and deploy.

Check the deploy result from Task -> My Task on the left panel and click the task item.

My software image is stored at another place. How to connect it with EdgeScale service?

Register your software image with the URL link and make sure it could be downloaded.

Which platforms are supported by EdgeScale? Does it support x86?

Currently, it supports ARM64 and ARM32 platform. x86 is not supported yet.

Is EdgeScale open-source?

EdgeScale consists of two parts: EdgeScale cloud service and client (device agents).

EdgeScale client is open-source and can be found at

EdgeScale cloud service is not open-source and provides commercial service.

How to fix the following issue when board is boot up with ubuntu rootfs?

E0211 16:29:14.093572    3902 kubelet_node_status.go:106] Unable to register node "" with API server: Post x509: certificate has expired or is not yet valid

The error message indicates the certificate is expired on the board. The issue is caused by incorrect date setting. Please update the system time and hardware time to current time.

How to create a device and enroll it with escli?

  1. Use escli model create to create a new model. Skip this if you want to use existed models.
  2. Use command escli device create –fuid xxx –model_id yyy to create a new device, then run “bootstrap-enroll-<device>”.sh /dev/zzz, (zzz is the SD card which will be attached to device board), model_id is the model’s id created in step #1.
  3. Use command escli solution create to create a new solution. model_id is the one created by step #1. Please refer to 3. Deploy EdgeScale agents on the device for solution image build. Skip it if you want to use existed solution images.
  4. Program the bootstrap image to board’s nor/qspi flash. Refer to Bootstrap for detailed steps.
  5. Insert the SD card prepared in step #2 to board’s MMC slot.
  6. Reset the board. The board will then download the solution image created in step #3 automatically.
  7. After the solution image is installed, you will see this device is online and ready to deploy application.

How to make the size of the Docker image small?

When packaging an application in a Docker image, the image size would be bigger than expected. To keep the size small, the following tips could be helpful.

1. Programming Application in Go Language

Applications in Go can include almost all dependencies by itself. When packaging them in Docker image, it’s unnecessary to include a base image from a released OS. Just package them with the dependency files (e.g. certification). It can reduce the image size greatly. An example Dockerfile to package an application called “hello” is as follows:

FROM scratch
COPY hello .
CMD ["./hello"]

To not depend on external libraries at runtime, there are some tips on the Go compilation. To remove the dependence on the system library, disable cgo using “CGO_ENABLED=0”. And, add ‘-extldflags “-static”’ to the -ldflags. This means to link external libraries statically. This way, the Go application would not link the external libraries at runtime.

In addition, the Go compiler supports some flags to reduce the size of the execution files. The “-s” flag means getting rid of the symbol table, and the “-w” means getting rid of the debug information. Adding “-s” and “-w” in the -ldflags can reduce the file size considerably.

For example, compile “hello.go”:
CGO_ENABLED=0 go build -ldflags=“-s -w” -ldflags ‘-extldflags “-static”’ hello.go

2. Use Google’s Distroless Images

Google distroless is a project that provides the minimal size of the base images. It supports a minimal runtime for java, c, nodejs, and so on.

An example for nodejs, “hello.js” is as follows:

COPY hello.js /app
CMD ["hello.js"]

3. Use Docker Multi-Stage Builds

In practice, one Docker image could not solve all problems. In the building stage, the Docker image includes compiler and other tools. And, in the production environment, it needs a minimal size of Docker image. So, multiple Docker images are needed for building, testing, and production. Docker multi-stage builds provides a good solution. It can include multiple Docker images in one single Dockerfile.

An example to build a Go application and output a minimal docker image:

FROM golang:1.7.3 as builder
WORKDIR /go/src/
COPY hello.go .
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -ldflags \'-extldflags "-static"\' -o hello .

FROM scratch
WORKDIR /root/
COPY --from=builder /go/src/ .
CMD ["./hello"]