diff --git a/src/plugins/docker/dockerapi.cpp b/src/plugins/docker/dockerapi.cpp index d9a0d590596..6b6198e5aa1 100644 --- a/src/plugins/docker/dockerapi.cpp +++ b/src/plugins/docker/dockerapi.cpp @@ -75,6 +75,23 @@ bool DockerApi::isContainerRunning(const QString &containerId) return false; } +bool DockerApi::imageExists(const QString &imageId) +{ + Process process; + FilePath dockerExe = dockerClient(); + if (dockerExe.isEmpty() || !dockerExe.isExecutableFile()) + return false; + + process.setCommand( + CommandLine(dockerExe, QStringList{"image", "inspect", imageId, "--format", "{{.Id}}"})); + process.runBlocking(); + + if (process.exitCode() == 0) + return true; + + return false; +} + void DockerApi::checkCanConnect(bool async) { if (async) { diff --git a/src/plugins/docker/dockerapi.h b/src/plugins/docker/dockerapi.h index 859cd753281..e97820ce6e6 100644 --- a/src/plugins/docker/dockerapi.h +++ b/src/plugins/docker/dockerapi.h @@ -44,6 +44,7 @@ public: QFuture>> networks(); bool isContainerRunning(const QString &containerId); + bool imageExists(const QString &imageId); signals: void dockerDaemonAvailableChanged(); diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp index 2aebe63d395..aa4f936c197 100644 --- a/src/plugins/docker/dockerdevice.cpp +++ b/src/plugins/docker/dockerdevice.cpp @@ -247,6 +247,9 @@ public: if (DeviceFileAccess *fileAccess = m_fileAccess.readLocked()->get()) return fileAccess; + if (!DockerApi::instance()->imageExists(q->repoAndTag())) + return nullptr; + SynchronizedValue>::unique_lock fileAccess = m_fileAccess.writeLocked(); if (*fileAccess) @@ -1003,6 +1006,8 @@ Result DockerDevicePrivate::updateContainerAccess() return make_unexpected(Tr::tr("Device is shut down")); if (DockerApi::isDockerDaemonAvailable(false).value_or(false) == false) return make_unexpected(Tr::tr("Docker system is not reachable")); + if (!DockerApi::instance()->imageExists(q->repoAndTag())) + return make_unexpected(Tr::tr("Docker image \"%1\" not found.").arg(q->repoAndTag())); auto lockedThread = m_deviceThread.writeLocked(); if (*lockedThread)