diff --git a/Dockerfile b/Dockerfile
index 47d47b0..9529d7b 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,14 +1,12 @@
FROM --platform=${TARGETPLATFORM:-linux/amd64} alpine as build
-RUN apk update && apk add crystal shards yaml-dev openssl-dev zlib-dev libxml2-dev && apk cache clean
+RUN apk update && apk add crystal shards yaml-dev openssl-dev zlib-dev libxml2-dev make && apk cache clean
RUN addgroup -S app && adduser app -S -G app
WORKDIR /home/app
-COPY shard.yml ./
+COPY shard.yml Makefile ./
RUN mkdir src/
COPY src/ src/
COPY runtimes/ runtimes/
-RUN shards install
-RUN shards build -d --error-trace
-RUN cat .rucksack >> bin/faaso
+RUN make
# RUN strip bin/*
FROM --platform=${TARGETPLATFORM:-linux/amd64} alpine as ship
diff --git a/src/daemon/funko.cr b/src/daemon/funko.cr
index 6e44f6d..6574a7b 100644
--- a/src/daemon/funko.cr
+++ b/src/daemon/funko.cr
@@ -126,6 +126,16 @@ module Funko
funko.wait_for(1, 1)
end
+ # Delete => scale to 0, remove all containers and images
+ delete "/funkos/:name/" do |env|
+ name = env.params.url["name"]
+ funko = Funko.from_names([name])[0]
+ funko.scale(0)
+ funko.wait_for(0, 1)
+ funko.remove_all_containers
+ funko.remove_all_images
+ end
+
# Return an iframe that shows the container's logs
get "/funkos/terminal/logs/:instance/" do |env|
instance = env.params.url["instance"]
diff --git a/src/funko.cr b/src/funko.cr
index 5d2ba1a..f37efda 100644
--- a/src/funko.cr
+++ b/src/funko.cr
@@ -224,6 +224,32 @@ module Funko
end
end
+ # Remove all containers related to this funko
+ def remove_all_containers
+ docker_api = Docr::API.new(Docr::Client.new)
+ docker_api.containers.list(all: true).select { |container|
+ container.@names.any?(&.starts_with?("/faaso-#{name}-"))
+ }.each { |container|
+ begin
+ docker_api.containers.stop(container.@id) if container.status != "exited"
+ rescue ex : Docr::Errors::DockerAPIError
+ Log.error { "#{ex}" } unless ex.status_code == 304 # This just happens
+ end
+ docker_api.containers.delete(container.@id)
+ }
+ end
+
+ # Remove all images related to this funko
+ def remove_all_images
+ docker_api = Docr::API.new(Docr::Client.new)
+ docker_api.images.list.select { |image|
+ return false if image.@repo_tags.nil?
+ true if image.@repo_tags.as(Array(String)).any?(&.starts_with?("faaso-#{name}:"))
+ }.each { |image|
+ docker_api.images.delete(image.@id)
+ }
+ end
+
# Create a container for this funko
def create_container(autostart : Bool = true) : String
# The path to secrets is tricky. On the server it will be in
diff --git a/src/main.cr b/src/main.cr
index 9a2b96d..281589d 100644
--- a/src/main.cr
+++ b/src/main.cr
@@ -1,8 +1,8 @@
require "./faaso.cr"
require "colorize"
require "docopt"
+require "rucksack"
-# Log formatter for
struct LogFormat < Log::StaticFormatter
@@colors = {
"FATAL" => :red,
@@ -84,9 +84,4 @@ when .fetch("status", false)
status = Faaso::Commands::Status.new.run(ans, ans["FUNKO"].as(String))
end
-exit(status)
-
-# Embed runtimes in the faaso binary using rucksack
-{% for name in `find ./runtimes -type f`.split('\n') %}
- rucksack({{name}})
-{% end %}
+exit(status)
\ No newline at end of file
diff --git a/src/runtime.cr b/src/runtime.cr
index c8ee299..41932d4 100644
--- a/src/runtime.cr
+++ b/src/runtime.cr
@@ -91,3 +91,8 @@ module Runtime
end
end
end
+
+# Embed runtimes in the faaso binary using rucksack
+{% for name in `find ./runtimes -type f`.split('\n') %}
+ rucksack({{name}})
+{% end %}
diff --git a/src/views/funkos.ecr b/src/views/funkos.ecr
index e4219a2..c7e0efa 100644
--- a/src/views/funkos.ecr
+++ b/src/views/funkos.ecr
@@ -39,9 +39,11 @@
<%- if f["scale"].as(String).to_i > 0 -%>
+
<%- else -%>
+
<%- end -%>
<%- end -%>