Quickstart

Five minutes from an empty account to an image you can pull anywhere.

1. Create a project

In the panel, use the + button and choose New project. The name becomes the second segment of every image reference in it, so pick something short — an organisation or a team name works well.

A project reserves storage from your plan's pool. You can change the allocation later without repushing anything.

2. Log in

bash
sudo docker login lazer.sh

There is no account password. Mint an API key in the panel and paste that when Docker prompts for one. For anything automated, use a narrowly scoped key and pipe it in:

bash
echo "$LAZER_KEY" | sudo docker login lazer.sh -u ci --password-stdin

The username is ignored when you present a key — the scopes on the key decide what you can do. See keys and scopes.

3. Push an image

Tag with the full reference, including the registry host, then push:

bash
sudo docker tag api:2.4.1 lazer.sh/acme/api:2.4.1
sudo docker push lazer.sh/acme/api:2.4.1

The repository is created on first push. You do not need to create it in the panel first.

Layers you have already pushed are deduplicated within the project, so the second image that shares a base only uploads what actually changed.

4. Pull it back

bash
sudo docker pull lazer.sh/acme/api:2.4.1

That pull is served from the edge location nearest to whatever ran it, and it does not count against anything. Pull as often as your CI likes.

5. Pull from Kubernetes

Create a pull secret from a key scoped to pull only, then reference it:

bash
kubectl create secret docker-registry lazer \
  --docker-server=lazer.sh \
  --docker-username=k8s \
  --docker-password="$LAZER_PULL_KEY"
yaml
spec:
    imagePullSecrets:
        - name: lazer
    containers:
        - name: api
          image: lazer.sh/acme/api:2.4.1

There is more detail, including per-namespace secrets, in the Kubernetes guide.

What next

Set a retention rule before your storage grows, and wire up GitHub Actions so pushes happen without a human.