Skip to content

Commit 442e34e

Browse files
committed
Fix #32629: Add User, Runtiem and DeviceRequest docker flags
1 parent 024f4ed commit 442e34e

5 files changed

Lines changed: 111 additions & 1 deletion

File tree

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@
214214
<dependency>
215215
<groupId>org.mandas</groupId>
216216
<artifactId>docker-client</artifactId>
217-
<version>7.0.99-OA</version>
217+
<version>7.0.8-OA-1</version>
218218
</dependency>
219219
<dependency>
220220
<groupId>org.glassfish.jersey.core</groupId>

src/main/java/eu/openanalytics/containerproxy/backend/docker/DockerEngineBackend.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import eu.openanalytics.containerproxy.model.runtime.runtimevalues.RuntimeValueKey;
3434
import eu.openanalytics.containerproxy.model.runtime.runtimevalues.UserIdKey;
3535
import eu.openanalytics.containerproxy.model.spec.ContainerSpec;
36+
import eu.openanalytics.containerproxy.model.spec.DockerDeviceRequest;
3637
import eu.openanalytics.containerproxy.model.spec.ProxySpec;
3738
import org.mandas.docker.client.DockerClient;
3839
import org.mandas.docker.client.LogStream;
@@ -134,6 +135,20 @@ public Proxy startContainer(Authentication user, Container initialContainer, Con
134135
spec.getVolumes().ifPresent(hostConfigBuilder::binds);
135136
hostConfigBuilder.privileged(isPrivileged() || spec.isPrivileged());
136137

138+
List<HostConfig.DeviceRequest> deviceRequests = new ArrayList<>();
139+
for (DockerDeviceRequest deviceRequest : spec.getDockerDeviceRequests()) {
140+
HostConfig.DeviceRequest.Builder builder= HostConfig.DeviceRequest.builder();
141+
deviceRequest.getDriver().ifPresent(builder::driver);
142+
deviceRequest.getCount().ifPresent(builder::count);
143+
deviceRequest.getDeviceIds().ifPresent(builder::deviceIds);
144+
deviceRequest.getCapabilities().ifPresent(builder::capabilities);
145+
deviceRequest.getOptions().ifPresent(builder::options);
146+
deviceRequests.add(builder.build());
147+
}
148+
hostConfigBuilder.deviceRequests(deviceRequests);
149+
150+
spec.getDockerRuntime().ifPresent(hostConfigBuilder::runtime);
151+
137152
Map<String, String> labels = spec.getLabels().getValueOrDefault(new HashMap<>());
138153

139154
Stream.concat(
@@ -152,6 +167,7 @@ public Proxy startContainer(Authentication user, Container initialContainer, Con
152167
.exposedPorts(dockerPortBindings.keySet())
153168
.cmd(spec.getCmd().getValueOrNull())
154169
.env(convertEnv(buildEnv(user, spec, proxy)))
170+
.user(spec.getDockerUser().getValueOrNull())
155171
.build();
156172

157173
proxyStartupLogBuilder.startingContainer(initialContainer.getIndex());

src/main/java/eu/openanalytics/containerproxy/backend/docker/DockerSwarmBackend.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ public Proxy startContainer(Authentication user, Container initialContainer, Con
136136
.dnsConfig(DnsConfig.builder().nameServers(spec.getDns().getValueOrNull()).build())
137137
.mounts(mounts)
138138
.secrets(secretBinds)
139+
.user(spec.getDockerUser().getValueOrNull())
139140
.build();
140141

141142
List<NetworkAttachmentConfig> networks = new ArrayList<>(spec.getNetworkConnections()

src/main/java/eu/openanalytics/containerproxy/model/spec/ContainerSpec.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,13 @@ public class ContainerSpec {
8181
private String dockerRegistryDomain;
8282
private String dockerRegistryUsername;
8383
private String dockerRegistryPassword;
84+
@Builder.Default
85+
private SpelField.String dockerRuntime = new SpelField.String();
86+
@Builder.Default
87+
private SpelField.String dockerUser = new SpelField.String();
88+
@Builder.Default
89+
private List<DockerDeviceRequest> dockerDeviceRequests = new ArrayList<>();
90+
8491
@Builder.Default
8592
private SpelField.String resourceName = new SpelField.String();
8693

@@ -122,6 +129,9 @@ public ContainerSpec firstResolve(SpecExpressionResolver resolver, SpecExpressio
122129
.cpuRequest(cpuRequest.resolve(resolver, context))
123130
.cpuLimit(cpuLimit.resolve(resolver, context))
124131
.portMapping(portMapping.stream().map(p -> p.resolve(resolver, context)).toList())
132+
.dockerRuntime(dockerRuntime.resolve(resolver, context))
133+
.dockerUser(dockerUser.resolve(resolver, context))
134+
.dockerDeviceRequests(dockerDeviceRequests)
125135
.build();
126136
}
127137

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
/**
2+
* ContainerProxy
3+
*
4+
* Copyright (C) 2016-2024 Open Analytics
5+
*
6+
* ===========================================================================
7+
*
8+
* This program is free software: you can redistribute it and/or modify
9+
* it under the terms of the Apache License as published by
10+
* The Apache Software Foundation, either version 2 of the License, or
11+
* (at your option) any later version.
12+
*
13+
* This program is distributed in the hope that it will be useful,
14+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
15+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16+
* Apache License for more details.
17+
*
18+
* You should have received a copy of the Apache License
19+
* along with this program. If not, see <http://www.apache.org/licenses/>
20+
*/
21+
package eu.openanalytics.containerproxy.model.spec;
22+
23+
import java.util.List;
24+
import java.util.Map;
25+
import java.util.Optional;
26+
27+
public class DockerDeviceRequest {
28+
29+
private String driver;
30+
private Integer count;
31+
private List<String> deviceIds;
32+
private List<List<String>> capabilities;
33+
private Map<String, String> options;
34+
35+
public DockerDeviceRequest(String driver, Integer count, List<String> deviceIds, List<List<String>> capabilities, Map<String, String> options) {
36+
this.driver = driver;
37+
this.count = count;
38+
this.deviceIds = deviceIds;
39+
this.capabilities = capabilities;
40+
this.options = options;
41+
}
42+
43+
public Optional<String> getDriver() {
44+
return Optional.ofNullable(driver);
45+
}
46+
47+
public void setDriver(String driver) {
48+
this.driver = driver;
49+
}
50+
51+
public Optional<Integer> getCount() {
52+
return Optional.ofNullable(count);
53+
}
54+
55+
public void setCount(Integer count) {
56+
this.count = count;
57+
}
58+
59+
public Optional<List<String>> getDeviceIds() {
60+
return Optional.ofNullable(deviceIds);
61+
}
62+
63+
public void setDeviceIds(List<String> deviceIds) {
64+
this.deviceIds = deviceIds;
65+
}
66+
67+
public Optional<List<List<String>>> getCapabilities() {
68+
return Optional.ofNullable(capabilities);
69+
}
70+
71+
public void setCapabilities(List<List<String>> capabilities) {
72+
this.capabilities = capabilities;
73+
}
74+
75+
public Optional<Map<String, String>> getOptions() {
76+
return Optional.ofNullable(options);
77+
}
78+
79+
public void setOptions(Map<String, String> options) {
80+
this.options = options;
81+
}
82+
83+
}

0 commit comments

Comments
 (0)