feat: rolling update
This commit is contained in:
@@ -9,3 +9,4 @@ const VALID_CRON_STRINGS = [
|
||||
'monthly' => '0 0 1 * *',
|
||||
'yearly' => '0 0 1 1 *',
|
||||
];
|
||||
const RESTART_MODE = 'unless-stopped';
|
||||
|
||||
@@ -1,14 +1,27 @@
|
||||
<?php
|
||||
|
||||
use App\Models\Application;
|
||||
use App\Models\Server;
|
||||
use Illuminate\Support\Collection;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
function getCurrentApplicationContainerStatus(Server $server, int $id): Collection {
|
||||
$containers = instant_remote_process(["docker ps -a --filter='label=coolify.applicationId={$id}' --format '{{json .}}' "], $server);
|
||||
if (!$containers) {
|
||||
return collect([]);
|
||||
}
|
||||
return format_docker_command_output_to_json($containers);
|
||||
}
|
||||
|
||||
function format_docker_command_output_to_json($rawOutput): Collection
|
||||
{
|
||||
$outputLines = explode(PHP_EOL, $rawOutput);
|
||||
|
||||
return collect($outputLines)
|
||||
if (count($outputLines) === 1) {
|
||||
$outputLines = collect($outputLines[0]);
|
||||
} else {
|
||||
$outputLines = collect($outputLines);
|
||||
}
|
||||
return $outputLines
|
||||
->reject(fn ($line) => empty($line))
|
||||
->map(fn ($outputLine) => json_decode($outputLine, true, flags: JSON_THROW_ON_ERROR));
|
||||
}
|
||||
@@ -44,26 +57,38 @@ function format_docker_envs_to_json($rawOutput)
|
||||
}
|
||||
}
|
||||
|
||||
function get_container_status(Server $server, string $container_id, bool $all_data = false, bool $throwError = false)
|
||||
function getApplicationContainerStatus(Application $application) {
|
||||
$server = $application->destination->server;
|
||||
$id = $application->id;
|
||||
|
||||
$containers = getCurrentApplicationContainerStatus($server, $id);
|
||||
if ($containers->count() > 0) {
|
||||
$status = data_get($containers[0], 'State', 'exited');
|
||||
return $status;
|
||||
}
|
||||
return 'exited';
|
||||
}
|
||||
function getContainerStatus(Server $server, string $container_id, bool $all_data = false, bool $throwError = false)
|
||||
{
|
||||
check_server_connection($server);
|
||||
// check_server_connection($server);
|
||||
$container = instant_remote_process(["docker inspect --format '{{json .}}' {$container_id}"], $server, $throwError);
|
||||
if (!$container) {
|
||||
return 'exited';
|
||||
}
|
||||
$container = format_docker_command_output_to_json($container);
|
||||
if ($all_data) {
|
||||
return $container[0];
|
||||
return $container;
|
||||
}
|
||||
return data_get($container[0], 'State.Status', 'exited');
|
||||
}
|
||||
|
||||
function generate_container_name(string $uuid, int $pull_request_id = 0)
|
||||
function generateApplicationContainerName(string $uuid, int $pull_request_id = 0)
|
||||
{
|
||||
if ($pull_request_id !== 0) {
|
||||
return $uuid . '-pr-' . $pull_request_id;
|
||||
$now = now()->format('YmdHis');
|
||||
if ($pull_request_id !== 0 && $pull_request_id !== null) {
|
||||
return $uuid . '-pr-' . $pull_request_id . '-' . $now;
|
||||
} else {
|
||||
return $uuid;
|
||||
return $uuid . '-' . $now;
|
||||
}
|
||||
}
|
||||
function get_port_from_dockerfile($dockerfile): int
|
||||
|
||||
@@ -32,7 +32,7 @@ function generate_default_proxy_configuration(Server $server)
|
||||
"traefik" => [
|
||||
"container_name" => "coolify-proxy",
|
||||
"image" => "traefik:v2.10",
|
||||
"restart" => "always",
|
||||
"restart" => RESTART_MODE,
|
||||
"extra_hosts" => [
|
||||
"host.docker.internal:host-gateway",
|
||||
],
|
||||
|
||||
Reference in New Issue
Block a user