From ada78161482e50d02f3888f4e447150df876e619 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sun, 19 Jul 2020 17:43:59 +0300 Subject: [PATCH] Added Deno functions env --- app/config/environments.php | 7 +++++++ app/workers/functions.php | 8 +++++--- docker/environments/deno-1.2/Dockerfile | 11 +++++++++++ docker/environments/deno-1.2/build.sh | 7 +++++++ public/images/environments/deno.png | Bin 0 -> 26605 bytes 5 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 docker/environments/deno-1.2/Dockerfile create mode 100644 docker/environments/deno-1.2/build.sh create mode 100644 public/images/environments/deno.png diff --git a/app/config/environments.php b/app/config/environments.php index 9ae81db5b0..cd312555a5 100644 --- a/app/config/environments.php +++ b/app/config/environments.php @@ -29,6 +29,13 @@ return [ 'image' => 'appwrite/env-python:3.8', 'logo' => 'python.png', ], + 'deno-1.2' => [ + 'name' => 'Deno', + 'version' => '1.2', + 'base' => 'hayd/deno:alpine-1.2.0', + 'image' => 'appwrite/env-deno:1.2', + 'logo' => 'deno.png', + ], // 'dart-2.8' => [ // 'name' => 'Dart', // 'version' => '2.8', diff --git a/app/workers/functions.php b/app/workers/functions.php index 6730068676..b3d57fac58 100644 --- a/app/workers/functions.php +++ b/app/workers/functions.php @@ -7,6 +7,7 @@ use Appwrite\Database\Database; use Appwrite\Database\Adapter\MySQL as MySQLAdapter; use Appwrite\Database\Adapter\Redis as RedisAdapter; use Appwrite\Database\Validator\Authorization; +use Utopia\App; use Utopia\CLI\Console; use Utopia\Config\Config; @@ -265,6 +266,7 @@ class FunctionsV1 $exitCode = Console::execute("docker run \ -d \ + --entrypoint=\"\" \ --cpus=4 \ --memory=128m \ --memory-swap=128m \ @@ -278,7 +280,7 @@ class FunctionsV1 {$environment['image']} \ sh -c 'mv /tmp/code.tar.gz /usr/local/src/code.tar.gz && tar -zxf /usr/local/src/code.tar.gz --strip 1 && rm /usr/local/src/code.tar.gz && tail -f /dev/null'" , null, $stdout, $stderr, 30); - + $executionEnd = \microtime(true); if($exitCode !== 0) { @@ -297,7 +299,7 @@ class FunctionsV1 $executionStart = \microtime(true); $exitCode = Console::execute("docker exec {$container} {$command}" - , null, $stdout, $stderr, $function->getAttribute('timeout', 900)); // TODO add app env for max timeout + , null, $stdout, $stderr, $function->getAttribute('timeout', (int) App::getEnv('_APP_FUNCTIONS_TIMEOUT', 900))); // TODO add app env for max timeout $executionEnd = \microtime(true); @@ -322,7 +324,7 @@ class FunctionsV1 Console::success(count($list).' running containers counted'); - $max = 10; + $max = (int) App::getEnv('_APP_FUNCTIONS_CONTAINERS'); if(count($list) > $max) { Console::info('Starting containers cleanup'); diff --git a/docker/environments/deno-1.2/Dockerfile b/docker/environments/deno-1.2/Dockerfile new file mode 100644 index 0000000000..b6877da806 --- /dev/null +++ b/docker/environments/deno-1.2/Dockerfile @@ -0,0 +1,11 @@ +FROM hayd/deno:alpine-1.2.0 + +LABEL maintainer="team@appwrite.io" + +RUN apk add tar + +RUN mkdir /usr/local/src + +WORKDIR /usr/local/src/ + +ENV DENO_DIR=/usr/local/src/.appwrite \ No newline at end of file diff --git a/docker/environments/deno-1.2/build.sh b/docker/environments/deno-1.2/build.sh new file mode 100644 index 0000000000..5eaaffb491 --- /dev/null +++ b/docker/environments/deno-1.2/build.sh @@ -0,0 +1,7 @@ +echo 'Starting Deno 1.2 build...' + +docker build --tag appwrite/env-deno:1.2 . + +echo 'Pushing Deno 1.2 build to registry...' + +docker push appwrite/env-deno:1.2 \ No newline at end of file diff --git a/public/images/environments/deno.png b/public/images/environments/deno.png new file mode 100644 index 0000000000000000000000000000000000000000..5ff1b53ceff704cc487a459f89d446572cae5e00 GIT binary patch literal 26605 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 literal 0 HcmV?d00001