Getting Started
Run exposes a push-oriented Docker Registry v2 subset and a Console API for repository state, starts, stops, rollbacks, environment variables, and volumes.
Authentication
Registry endpoints use Docker Basic Auth credentials configured by docker login.
1docker login run.hola.cloud
Building and Pushing an Image
Create a simple application with a Dockerfile:
1FROM alpine:latest
2COPY app.sh /app.sh
3RUN chmod +x /app.sh
4CMD ["/app.sh"]
Build and tag the image:
1docker build -t run.hola.cloud/my-project/my-app:v1 .
Push to Run:
1docker push run.hola.cloud/my-project/my-app:v1
Reading Console Data
Query the current Console data for a repository:
curl "https://api.hola.cloud/api/console?repository=my-project/my-app"GET /api/console?repository=my-project/my-app HTTP/1.1
Host: api.hola.cloud
package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, err := http.NewRequest("GET", "https://api.hola.cloud/api/console?repository=my-project/my-app", nil)
if err != nil {
panic(err)
}
resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
responseBody, err := io.ReadAll(resp.Body)
if err != nil {
panic(err)
}
fmt.Println(string(responseBody))
}
<?php
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => 'https://api.hola.cloud/api/console?repository=my-project/my-app',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'GET',
]);
$response = curl_exec($ch);
if ($response === false) {
throw new Exception(curl_error($ch));
}
curl_close($ch);
echo $response;
import requests
response = requests.request(
"GET",
"https://api.hola.cloud/api/console?repository=my-project/my-app"
)
print(response.text)
const response = await fetch("https://api.hola.cloud/api/console?repository=my-project/my-app", {
method: "GET"
});
console.log(await response.text());
const response = await fetch("https://api.hola.cloud/api/console?repository=my-project/my-app", {
method: "GET"
});
const text = await response.text();
console.log(text);
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Main {
public static void main(String[] args) throws Exception {
var request = HttpRequest.newBuilder()
.uri(URI.create("https://api.hola.cloud/api/console?repository=my-project/my-app"))
.method("GET", HttpRequest.BodyPublishers.noBody())
.build();
var response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}Starting a Repository
Start a repository from a pushed tag or digest:
curl -X POST "https://api.hola.cloud/api/console/start" \
-H "Content-Type: application/json" \
-d '{
"repository": "my-project/my-app",
"reference": "v1"
}'POST /api/console/start HTTP/1.1
Host: api.hola.cloud
Content-Type: application/json
{
"repository": "my-project/my-app",
"reference": "v1"
}package main
import (
"fmt"
"io"
"net/http"
"encoding/json"
"strings"
)
func main() {
payload := map[string]any{"reference": "v1", "repository": "my-project/my-app"}
bodyBytes, err := json.Marshal(payload)
if err != nil {
panic(err)
}
body := string(bodyBytes)
req, err := http.NewRequest("POST", "https://api.hola.cloud/api/console/start", strings.NewReader(body))
if err != nil {
panic(err)
}
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
responseBody, err := io.ReadAll(resp.Body)
if err != nil {
panic(err)
}
fmt.Println(string(responseBody))
}
<?php
$payload = ['reference' => 'v1', 'repository' => 'my-project/my-app'];
$body = json_encode($payload);
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => 'https://api.hola.cloud/api/console/start',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => $body,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
],
]);
$response = curl_exec($ch);
if ($response === false) {
throw new Exception(curl_error($ch));
}
curl_close($ch);
echo $response;
import requests
import json
headers = {
"Content-Type": "application/json",
}
payload = {"reference": "v1", "repository": "my-project/my-app"}
body = json.dumps(payload)
response = requests.request(
"POST",
"https://api.hola.cloud/api/console/start",
headers=headers,
data=body
)
print(response.text)
const payload = {"reference": "v1", "repository": "my-project/my-app"};
const response = await fetch("https://api.hola.cloud/api/console/start", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(payload)
});
console.log(await response.text());
const payload = {"reference": "v1", "repository": "my-project/my-app"};
const response = await fetch("https://api.hola.cloud/api/console/start", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(payload)
});
const text = await response.text();
console.log(text);
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Map;
import java.util.List;
public class Main {
public static void main(String[] args) throws Exception {
var payload = Map.of("reference", "v1", "repository", "my-project/my-app");
var body = new ObjectMapper().writeValueAsString(payload);
var request = HttpRequest.newBuilder()
.uri(URI.create("https://api.hola.cloud/api/console/start"))
.method("POST", HttpRequest.BodyPublishers.ofString(body))
.header("Content-Type", "application/json")
.build();
var response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}You can also use a digest:
1{
2 "repository": "my-project/my-app",
3 "digest": "sha256:a1b2c3d4..."
4}
Stopping a Repository
curl -X POST "https://api.hola.cloud/api/console/stop" \
-H "Content-Type: application/json" \
-d '{"repository": "my-project/my-app"}'POST /api/console/stop HTTP/1.1
Host: api.hola.cloud
Content-Type: application/json
{"repository": "my-project/my-app"}package main
import (
"fmt"
"io"
"net/http"
"encoding/json"
"strings"
)
func main() {
payload := map[string]any{"repository": "my-project/my-app"}
bodyBytes, err := json.Marshal(payload)
if err != nil {
panic(err)
}
body := string(bodyBytes)
req, err := http.NewRequest("POST", "https://api.hola.cloud/api/console/stop", strings.NewReader(body))
if err != nil {
panic(err)
}
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
responseBody, err := io.ReadAll(resp.Body)
if err != nil {
panic(err)
}
fmt.Println(string(responseBody))
}
<?php
$payload = ['repository' => 'my-project/my-app'];
$body = json_encode($payload);
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => 'https://api.hola.cloud/api/console/stop',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => $body,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
],
]);
$response = curl_exec($ch);
if ($response === false) {
throw new Exception(curl_error($ch));
}
curl_close($ch);
echo $response;
import requests
import json
headers = {
"Content-Type": "application/json",
}
payload = {"repository": "my-project/my-app"}
body = json.dumps(payload)
response = requests.request(
"POST",
"https://api.hola.cloud/api/console/stop",
headers=headers,
data=body
)
print(response.text)
const payload = {"repository": "my-project/my-app"};
const response = await fetch("https://api.hola.cloud/api/console/stop", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(payload)
});
console.log(await response.text());
const payload = {"repository": "my-project/my-app"};
const response = await fetch("https://api.hola.cloud/api/console/stop", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(payload)
});
const text = await response.text();
console.log(text);
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Map;
import java.util.List;
public class Main {
public static void main(String[] args) throws Exception {
var payload = Map.of("repository", "my-project/my-app");
var body = new ObjectMapper().writeValueAsString(payload);
var request = HttpRequest.newBuilder()
.uri(URI.create("https://api.hola.cloud/api/console/stop"))
.method("POST", HttpRequest.BodyPublishers.ofString(body))
.header("Content-Type", "application/json")
.build();
var response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}Rolling Back
Rollback uses the same repository plus reference or digest shape:
curl -X POST "https://api.hola.cloud/api/console/rollback" \
-H "Content-Type: application/json" \
-d '{
"repository": "my-project/my-app",
"reference": "v0"
}'POST /api/console/rollback HTTP/1.1
Host: api.hola.cloud
Content-Type: application/json
{
"repository": "my-project/my-app",
"reference": "v0"
}package main
import (
"fmt"
"io"
"net/http"
"encoding/json"
"strings"
)
func main() {
payload := map[string]any{"reference": "v0", "repository": "my-project/my-app"}
bodyBytes, err := json.Marshal(payload)
if err != nil {
panic(err)
}
body := string(bodyBytes)
req, err := http.NewRequest("POST", "https://api.hola.cloud/api/console/rollback", strings.NewReader(body))
if err != nil {
panic(err)
}
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
responseBody, err := io.ReadAll(resp.Body)
if err != nil {
panic(err)
}
fmt.Println(string(responseBody))
}
<?php
$payload = ['reference' => 'v0', 'repository' => 'my-project/my-app'];
$body = json_encode($payload);
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => 'https://api.hola.cloud/api/console/rollback',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => $body,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
],
]);
$response = curl_exec($ch);
if ($response === false) {
throw new Exception(curl_error($ch));
}
curl_close($ch);
echo $response;
import requests
import json
headers = {
"Content-Type": "application/json",
}
payload = {"reference": "v0", "repository": "my-project/my-app"}
body = json.dumps(payload)
response = requests.request(
"POST",
"https://api.hola.cloud/api/console/rollback",
headers=headers,
data=body
)
print(response.text)
const payload = {"reference": "v0", "repository": "my-project/my-app"};
const response = await fetch("https://api.hola.cloud/api/console/rollback", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(payload)
});
console.log(await response.text());
const payload = {"reference": "v0", "repository": "my-project/my-app"};
const response = await fetch("https://api.hola.cloud/api/console/rollback", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(payload)
});
const text = await response.text();
console.log(text);
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Map;
import java.util.List;
public class Main {
public static void main(String[] args) throws Exception {
var payload = Map.of("reference", "v0", "repository", "my-project/my-app");
var body = new ObjectMapper().writeValueAsString(payload);
var request = HttpRequest.newBuilder()
.uri(URI.create("https://api.hola.cloud/api/console/rollback"))
.method("POST", HttpRequest.BodyPublishers.ofString(body))
.header("Content-Type", "application/json")
.build();
var response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}Managing Environment Variables
curl -X PUT "https://api.hola.cloud/api/console/env" \
-H "Content-Type: application/json" \
-d '{
"repository": "my-project/my-app",
"env": [
{"key": "LOG_LEVEL", "desired_value": "debug"},
{"key": "DATABASE_URL", "desired_value": "postgres://..."}
]
}'PUT /api/console/env HTTP/1.1
Host: api.hola.cloud
Content-Type: application/json
{
"repository": "my-project/my-app",
"env": [
{"key": "LOG_LEVEL", "desired_value": "debug"},
{"key": "DATABASE_URL", "desired_value": "postgres://..."}
]
}package main
import (
"fmt"
"io"
"net/http"
"encoding/json"
"strings"
)
func main() {
payload := map[string]any{"env": []any{map[string]any{"desired_value": "debug", "key": "LOG_LEVEL"}, map[string]any{"desired_value": "postgres://...", "key": "DATABASE_URL"}}, "repository": "my-project/my-app"}
bodyBytes, err := json.Marshal(payload)
if err != nil {
panic(err)
}
body := string(bodyBytes)
req, err := http.NewRequest("PUT", "https://api.hola.cloud/api/console/env", strings.NewReader(body))
if err != nil {
panic(err)
}
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
responseBody, err := io.ReadAll(resp.Body)
if err != nil {
panic(err)
}
fmt.Println(string(responseBody))
}
<?php
$payload = ['env' => [['desired_value' => 'debug', 'key' => 'LOG_LEVEL'], ['desired_value' => 'postgres://...', 'key' => 'DATABASE_URL']], 'repository' => 'my-project/my-app'];
$body = json_encode($payload);
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => 'https://api.hola.cloud/api/console/env',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'PUT',
CURLOPT_POSTFIELDS => $body,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
],
]);
$response = curl_exec($ch);
if ($response === false) {
throw new Exception(curl_error($ch));
}
curl_close($ch);
echo $response;
import requests
import json
headers = {
"Content-Type": "application/json",
}
payload = {"env": [{"desired_value": "debug", "key": "LOG_LEVEL"}, {"desired_value": "postgres://...", "key": "DATABASE_URL"}], "repository": "my-project/my-app"}
body = json.dumps(payload)
response = requests.request(
"PUT",
"https://api.hola.cloud/api/console/env",
headers=headers,
data=body
)
print(response.text)
const payload = {"env": [{"desired_value": "debug", "key": "LOG_LEVEL"}, {"desired_value": "postgres://...", "key": "DATABASE_URL"}], "repository": "my-project/my-app"};
const response = await fetch("https://api.hola.cloud/api/console/env", {
method: "PUT",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(payload)
});
console.log(await response.text());
const payload = {"env": [{"desired_value": "debug", "key": "LOG_LEVEL"}, {"desired_value": "postgres://...", "key": "DATABASE_URL"}], "repository": "my-project/my-app"};
const response = await fetch("https://api.hola.cloud/api/console/env", {
method: "PUT",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(payload)
});
const text = await response.text();
console.log(text);
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Map;
import java.util.List;
public class Main {
public static void main(String[] args) throws Exception {
var payload = Map.of("env", List.of(Map.of("desired_value", "debug", "key", "LOG_LEVEL"), Map.of("desired_value", "postgres://...", "key", "DATABASE_URL")), "repository", "my-project/my-app");
var body = new ObjectMapper().writeValueAsString(payload);
var request = HttpRequest.newBuilder()
.uri(URI.create("https://api.hola.cloud/api/console/env"))
.method("PUT", HttpRequest.BodyPublishers.ofString(body))
.header("Content-Type", "application/json")
.build();
var response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}Managing Volumes
curl -X PUT "https://api.hola.cloud/api/console/volumes" \
-H "Content-Type: application/json" \
-d '{
"repository": "my-project/my-app",
"volumes": [
{"name": "my-data", "target": "/data", "mode": "rw"}
]
}'PUT /api/console/volumes HTTP/1.1
Host: api.hola.cloud
Content-Type: application/json
{
"repository": "my-project/my-app",
"volumes": [
{"name": "my-data", "target": "/data", "mode": "rw"}
]
}package main
import (
"fmt"
"io"
"net/http"
"encoding/json"
"strings"
)
func main() {
payload := map[string]any{"repository": "my-project/my-app", "volumes": []any{map[string]any{"mode": "rw", "name": "my-data", "target": "/data"}}}
bodyBytes, err := json.Marshal(payload)
if err != nil {
panic(err)
}
body := string(bodyBytes)
req, err := http.NewRequest("PUT", "https://api.hola.cloud/api/console/volumes", strings.NewReader(body))
if err != nil {
panic(err)
}
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
responseBody, err := io.ReadAll(resp.Body)
if err != nil {
panic(err)
}
fmt.Println(string(responseBody))
}
<?php
$payload = ['repository' => 'my-project/my-app', 'volumes' => [['mode' => 'rw', 'name' => 'my-data', 'target' => '/data']]];
$body = json_encode($payload);
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => 'https://api.hola.cloud/api/console/volumes',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'PUT',
CURLOPT_POSTFIELDS => $body,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
],
]);
$response = curl_exec($ch);
if ($response === false) {
throw new Exception(curl_error($ch));
}
curl_close($ch);
echo $response;
import requests
import json
headers = {
"Content-Type": "application/json",
}
payload = {"repository": "my-project/my-app", "volumes": [{"mode": "rw", "name": "my-data", "target": "/data"}]}
body = json.dumps(payload)
response = requests.request(
"PUT",
"https://api.hola.cloud/api/console/volumes",
headers=headers,
data=body
)
print(response.text)
const payload = {"repository": "my-project/my-app", "volumes": [{"mode": "rw", "name": "my-data", "target": "/data"}]};
const response = await fetch("https://api.hola.cloud/api/console/volumes", {
method: "PUT",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(payload)
});
console.log(await response.text());
const payload = {"repository": "my-project/my-app", "volumes": [{"mode": "rw", "name": "my-data", "target": "/data"}]};
const response = await fetch("https://api.hola.cloud/api/console/volumes", {
method: "PUT",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(payload)
});
const text = await response.text();
console.log(text);
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Map;
import java.util.List;
public class Main {
public static void main(String[] args) throws Exception {
var payload = Map.of("repository", "my-project/my-app", "volumes", List.of(Map.of("mode", "rw", "name", "my-data", "target", "/data")));
var body = new ObjectMapper().writeValueAsString(payload);
var request = HttpRequest.newBuilder()
.uri(URI.create("https://api.hola.cloud/api/console/volumes"))
.method("PUT", HttpRequest.BodyPublishers.ofString(body))
.header("Content-Type", "application/json")
.build();
var response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}Complete Workflow Example
1docker login run.hola.cloud
2docker build -t run.hola.cloud/my-project/my-app:v1 .
3docker push run.hola.cloud/my-project/my-app:v1
4curl -X POST "https://api.hola.cloud/api/console/start" \
5 -H "Content-Type: application/json" \
6 -d '{"repository": "my-project/my-app", "reference": "v1"}'
7curl "https://api.hola.cloud/api/console?repository=my-project/my-app"
Comments