aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMarcus Tillmanns <[email protected]>2025-04-08 10:05:03 +0200
committerMarcus Tillmanns <[email protected]>2025-04-08 11:40:30 +0000
commit145bdd52609ecda52b1637a2e5d79e43935924c0 (patch)
tree13f15bb934b838b6a897a59f4fedf0f715e74f91 /src
parent0b107bc753f2dd6da77da17c56fde128076f33b8 (diff)
Docker: Add port mapping options
Diffstat (limited to 'src')
-rw-r--r--src/plugins/docker/dockerdevice.cpp94
-rw-r--r--src/plugins/docker/dockerdevice.h9
-rw-r--r--src/plugins/docker/dockerdevicewidget.cpp6
3 files changed, 108 insertions, 1 deletions
diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp
index 75c5ac7b065..5b3380d7ea2 100644
--- a/src/plugins/docker/dockerdevice.cpp
+++ b/src/plugins/docker/dockerdevice.cpp
@@ -684,6 +684,8 @@ DockerDevice::DockerDevice()
allowEmptyCommand.setValue(true);
+ portMappings.setSettingsKey("Ports");
+
setDisplayType(Tr::tr("Docker"));
setOsType(OsTypeLinux);
setupId(IDevice::ManuallyAdded);
@@ -971,6 +973,7 @@ CommandLine DockerDevicePrivate::createCommandLine()
}
dockerCreate.addArgs(createMountArgs());
+ dockerCreate.addArgs(q->portMappings.createArguments());
if (!q->keepEntryPoint())
dockerCreate.addArgs({"--entrypoint", "/bin/sh"});
@@ -1420,4 +1423,95 @@ std::optional<FilePath> DockerDevice::clangdExecutable() const
return d->clangdExecutable();
}
+class PortMapping : public Utils::AspectContainer
+{
+public:
+ PortMapping();
+
+ void addToLayoutImpl(Layouting::Layout &parent) override;
+
+ Utils::StringAspect ip{this};
+ Utils::IntegerAspect hostPort{this};
+ Utils::IntegerAspect containerPort{this};
+ Utils::SelectionAspect protocol{this};
+};
+
+PortMapping::PortMapping()
+{
+ ip.setSettingsKey("HostIp");
+ ip.setDefaultValue("0.0.0.0");
+ ip.setToolTip(Tr::tr("Host IP"));
+ ip.setLabelText(Tr::tr("Host IP:"));
+ ip.setDisplayStyle(StringAspect::LineEditDisplay);
+
+ hostPort.setSettingsKey("HostPort");
+ hostPort.setToolTip(Tr::tr("Host Port"));
+ hostPort.setRange(1, 65535);
+ hostPort.setDefaultValue(8080);
+ hostPort.setLabelText(Tr::tr("Host Port:"));
+
+ containerPort.setSettingsKey("ContainerPort");
+ containerPort.setToolTip(Tr::tr("Container Port"));
+ containerPort.setRange(1, 65535);
+ containerPort.setDefaultValue(8080);
+ containerPort.setLabelText(Tr::tr("Container Port:"));
+
+ protocol.setSettingsKey("Protocol");
+ protocol.setToolTip(Tr::tr("Protocol"));
+ protocol.addOption("tcp", "TCP");
+ protocol.addOption("udp", "UDP");
+ protocol.setDefaultValue("tcp");
+ protocol.setDisplayStyle(SelectionAspect::DisplayStyle::ComboBox);
+ protocol.setLabelText(Tr::tr("Protocol:"));
+
+ for (const auto &aspect : aspects()) {
+ connect(aspect, &BaseAspect::changed, this, &PortMapping::changed);
+ }
+}
+
+void PortMapping::addToLayoutImpl(Layouting::Layout &parent)
+{
+ using namespace Layouting;
+
+ parent.addItem(ip);
+ parent.addItem(hostPort);
+ parent.addItem(containerPort);
+ parent.addItem(protocol);
+}
+
+PortMappings::PortMappings(Utils::AspectContainer *container)
+ : AspectList(container)
+{
+ setCreateItemFunction([this]() {
+ auto mapping = std::make_unique<PortMapping>();
+ connect(mapping.get(), &PortMapping::changed, this, &AspectContainer::changed);
+ return mapping;
+ });
+}
+
+QStringList PortMappings::createArguments() const
+{
+ QStringList cmds;
+
+ forEachItem<PortMapping>([&cmds](const std::shared_ptr<PortMapping> &portMapping) {
+ if (portMapping->ip().isEmpty()) {
+ cmds
+ += {"-p",
+ QString("%1:%2/%3")
+ .arg(portMapping->hostPort())
+ .arg(portMapping->containerPort())
+ .arg(portMapping->protocol.stringValue())};
+ return;
+ }
+ cmds
+ += {"-p",
+ QString("%1:%2:%3/%4")
+ .arg(portMapping->ip())
+ .arg(portMapping->hostPort())
+ .arg(portMapping->containerPort())
+ .arg(portMapping->protocol.stringValue())};
+ });
+
+ return cmds;
+}
} // namespace Docker::Internal
diff --git a/src/plugins/docker/dockerdevice.h b/src/plugins/docker/dockerdevice.h
index 3f9e8455d85..3a3cf92115c 100644
--- a/src/plugins/docker/dockerdevice.h
+++ b/src/plugins/docker/dockerdevice.h
@@ -14,6 +14,14 @@
namespace Docker::Internal {
+class PortMappings : public Utils::AspectList
+{
+public:
+ PortMappings(Utils::AspectContainer *container);
+
+ QStringList createArguments() const;
+};
+
class DockerDevice : public ProjectExplorer::IDevice
{
public:
@@ -71,6 +79,7 @@ public:
Utils::StringSelectionAspect network{this};
Utils::StringAspect extraArgs{this};
DockerDeviceEnvironmentAspect environment{this};
+ PortMappings portMappings{this};
Utils::TextDisplay containerStatus{this};
diff --git a/src/plugins/docker/dockerdevicewidget.cpp b/src/plugins/docker/dockerdevicewidget.cpp
index 07e2075f8ec..9512dcf21ef 100644
--- a/src/plugins/docker/dockerdevicewidget.cpp
+++ b/src/plugins/docker/dockerdevicewidget.cpp
@@ -184,6 +184,10 @@ DockerDeviceWidget::DockerDeviceWidget(const IDevice::Ptr &device)
pathListLabel,
dockerDevice->mounts,
}, br,
+ Column {
+ Tr::tr("Port Mappings:"),
+ dockerDevice->portMappings,
+ }, br,
If { dockerDevice->isAutoDetected(), {}, {detectionControls} },
},br,
Tr::tr("Command line:"), createLineLabel, br,
@@ -218,4 +222,4 @@ void DockerDeviceWidget::updateDaemonStateTexts()
}
}
-} // Docker::Internal
+} // namespace Docker::Internal