feat: add Pull new images button while containers are running

Agent-Logs-Url: https://github.com/nextcloud/all-in-one/sessions/446ad3c6-142d-4e62-adb8-b43a7e548cda

Co-authored-by: szaimen <42591237+szaimen@users.noreply.github.com>
This commit is contained in:
copilot-swe-agent[bot]
2026-04-28 18:02:36 +00:00
committed by GitHub
parent 50643afd6a
commit 2121fec318
3 changed files with 25 additions and 3 deletions

View File

@@ -105,6 +105,7 @@ $app->post('/api/docker/restore', AIO\Controller\DockerController::class . ':Sta
$app->post('/api/docker/stop', AIO\Controller\DockerController::class . ':StopContainer');
$app->post('/api/docker/backup-reset-location', AIO\Controller\DockerController::class . ':DeleteBorgBackupConfig');
$app->post('/api/docker/prune', AIO\Controller\DockerController::class . ':SystemPrune');
$app->post('/api/docker/pull-images', AIO\Controller\DockerController::class . ':PullImages');
$app->get('/api/docker/logs', AIO\Controller\DockerController::class . ':GetLogs');
$app->post('/api/auth/login', AIO\Controller\LoginController::class . ':TryLogin');
$app->get('/api/auth/getlogin', AIO\Controller\LoginController::class . ':GetTryLogin');

View File

@@ -45,15 +45,15 @@ readonly class DockerController {
$this->dockerActionManager->ConnectContainerToNetwork($container);
}
private function PerformRecursiveImagePull(string $id) : void {
private function PerformRecursiveImagePull(string $id, ?\Closure $addToStreamingResponseBody = null) : void {
$container = $this->containerDefinitionFetcher->GetContainerById($id);
// Pull all dependencies first and then itself
foreach($container->dependsOn as $dependency) {
$this->PerformRecursiveImagePull($dependency);
$this->PerformRecursiveImagePull($dependency, $addToStreamingResponseBody);
}
$this->dockerActionManager->PullImage($container, true);
$this->dockerActionManager->PullImage($container, true, $addToStreamingResponseBody);
}
public function PullAllContainerImages(): void {
@@ -63,6 +63,19 @@ readonly class DockerController {
$this->PerformRecursiveImagePull($id);
}
public function PullImages(Request $request, Response $response, array $args) : Response {
// Get streaming response start and closure
$nonbufResp = $this->startStreamingResponse($response);
$addToStreamingResponseBody = $this->getAddToStreamingResponseBody($nonbufResp);
$id = self::TOP_CONTAINER;
$this->PerformRecursiveImagePull($id, $addToStreamingResponseBody);
// End streaming response
$this->finalizeStreamingResponse($nonbufResp);
return $nonbufResp;
}
public function GetLogs(Request $request, Response $response, array $args) : Response
{
$requestParams = $request->getQueryParams();

View File

@@ -291,6 +291,14 @@
{% if has_update_available == true %}
{% if is_mastercontainer_update_available == false %}
<p>⚠️ Container updates are available. Click on <strong>Stop containers</strong> and <strong>Start and update containers</strong> to update them. You should consider creating a backup first.</p>
{% if isAnyRunning == true and isApacheStarting != true %}
<p>Alternatively, you can already pull the new images now while the containers are still running. The new images will automatically be used whenever the containers are recreated either manually or automatically via AIO's daily backup/update schedule.</p>
<form method="POST" action="api/docker/pull-images" target="overlay-log">
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
<input type="submit" value="Pull new images" />
</form>
{% endif %}
{% endif %}
{% else %}
{% if is_mastercontainer_update_available == false %}