Skip to content

Commit ebbf8c7

Browse files
committed
Allow docker jobs to use a local container cache
1 parent 31629fd commit ebbf8c7

File tree

3 files changed

+86
-5
lines changed

3 files changed

+86
-5
lines changed

SequenceAnalysis/api-src/org/labkey/api/sequenceanalysis/pipeline/SequencePipelineService.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,8 @@ static public void setInstance(SequencePipelineService instance)
100100
*/
101101
abstract public String getDockerCommand();
102102

103+
abstract public boolean useLocalDockerContainerStorage();
104+
103105
abstract public Collection<String> getDockerVolumes(Container c);
104106

105107
/**

SequenceAnalysis/api-src/org/labkey/api/sequenceanalysis/run/DockerWrapper.java

Lines changed: 72 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package org.labkey.api.sequenceanalysis.run;
22

3+
import org.apache.commons.io.FileUtils;
34
import org.apache.commons.lang3.StringUtils;
45
import org.apache.logging.log4j.Logger;
56
import org.jetbrains.annotations.Nullable;
67
import org.labkey.api.pipeline.PipelineJobException;
78
import org.labkey.api.sequenceanalysis.pipeline.PipelineContext;
89
import org.labkey.api.sequenceanalysis.pipeline.PipelineOutputTracker;
910
import org.labkey.api.sequenceanalysis.pipeline.SequencePipelineService;
11+
import org.labkey.api.util.FileUtil;
1012
import org.labkey.api.writer.PrintWriters;
1113

1214
import java.io.File;
@@ -28,7 +30,8 @@ public class DockerWrapper extends AbstractCommandWrapper
2830
private final PipelineContext _ctx;
2931
private File _tmpDir = null;
3032
private String _entryPoint = null;
31-
private boolean _runPrune = true;
33+
private boolean _runPrune = false;
34+
private boolean _useLocalContainerStorage;
3235
private String _alternateUserHome = null;
3336
private final Map<String, String> _dockerEnvironment = new HashMap<>();
3437

@@ -37,6 +40,8 @@ public DockerWrapper(String containerName, Logger log, PipelineContext ctx)
3740
super(log);
3841
_containerName = containerName;
3942
_ctx = ctx;
43+
44+
_useLocalContainerStorage = SequencePipelineService.get().useLocalDockerContainerStorage();
4045
}
4146

4247
public void setAlternateUserHome(String alternateUserHome)
@@ -59,6 +64,11 @@ public void setRunPrune(boolean runPrune)
5964
_runPrune = runPrune;
6065
}
6166

67+
public void setUseLocalContainerStorage(boolean useLocalContainerStorage)
68+
{
69+
_useLocalContainerStorage = useLocalContainerStorage;
70+
}
71+
6272
public void executeWithDocker(List<String> containerArgs, File workDir, PipelineOutputTracker tracker) throws PipelineJobException
6373
{
6474
executeWithDocker(containerArgs, workDir, tracker, null);
@@ -79,14 +89,19 @@ public void executeWithDocker(List<String> containerArgs, File workDir, Pipeline
7989
writer.println("set -e");
8090

8191
writer.println("DOCKER='" + SequencePipelineService.get().getDockerCommand() + "'");
82-
writer.println("$DOCKER pull " + _containerName);
92+
writer.println("$DOCKER pull " + getLocalStorageArgs() + getEffectiveContainerName());
8393
if (_runPrune)
8494
{
85-
writer.println("$DOCKER image prune -f");
95+
writer.println("$DOCKER image prune " + getLocalStorageArgs() + "-f");
8696
}
8797

8898
writer.println("$DOCKER run --rm=true \\");
89-
writer.println("\t--group-add keep-groups \\");
99+
if (_useLocalContainerStorage)
100+
{
101+
getLogger().debug("Using local container storage: " + getLocalContainerDir().getPath());
102+
prepareLocalStorage();
103+
writer.println("\t" + getLocalStorageArgs() + "\\");
104+
}
90105

91106
// NOTE: getDockerVolumes() should be refactored to remove the -v and this logic should be updated accordingly:
92107
File homeDir = new File(System.getProperty("user.home"));
@@ -149,7 +164,7 @@ public void executeWithDocker(List<String> containerArgs, File workDir, Pipeline
149164
{
150165
writer.println("\t-e " + key + "='" + _dockerEnvironment.get(key) + "' \\");
151166
}
152-
writer.println("\t" + _containerName + " \\");
167+
writer.println("\t" + getEffectiveContainerName() + " \\");
153168
writer.println("\t" + dockerBashScript.getPath());
154169
writer.println("DOCKER_EXIT_CODE=$?");
155170
writer.println("echo 'Docker run exit code: '$DOCKER_EXIT_CODE");
@@ -170,6 +185,23 @@ public void executeWithDocker(List<String> containerArgs, File workDir, Pipeline
170185
localBashScript.setExecutable(true);
171186
dockerBashScript.setExecutable(true);
172187
execute(Arrays.asList("/bin/bash", localBashScript.getPath()));
188+
189+
if (_useLocalContainerStorage)
190+
{
191+
try
192+
{
193+
FileUtils.deleteDirectory(getLocalContainerDir());
194+
}
195+
catch (IOException e)
196+
{
197+
throw new PipelineJobException(e);
198+
}
199+
}
200+
}
201+
202+
private String getEffectiveContainerName()
203+
{
204+
return _containerName;
173205
}
174206

175207
public void addToDockerEnvironment(String key, String value)
@@ -203,4 +235,39 @@ private Collection<File> inspectInputFiles(Collection<File> inputFiles)
203235

204236
return Collections.emptySet();
205237
}
238+
239+
private File getLocalContainerDir()
240+
{
241+
return new File(SequencePipelineService.get().getJavaTempDir(), "containers");
242+
}
243+
244+
private File prepareLocalStorage() throws PipelineJobException
245+
{
246+
try
247+
{
248+
if (getLocalContainerDir().exists())
249+
{
250+
getLogger().debug("Deleting existing container dir: " + getLocalContainerDir());
251+
FileUtils.deleteDirectory(getLocalContainerDir());
252+
}
253+
254+
FileUtil.createDirectory(getLocalContainerDir().toPath());
255+
256+
return getLocalContainerDir();
257+
}
258+
catch (IOException e)
259+
{
260+
throw new PipelineJobException(e);
261+
}
262+
}
263+
264+
private String getLocalStorageArgs()
265+
{
266+
if (!_useLocalContainerStorage)
267+
{
268+
return "";
269+
}
270+
271+
return "--root=" + getLocalContainerDir().getPath() + " ";
272+
}
206273
}

SequenceAnalysis/src/org/labkey/sequenceanalysis/SequencePipelineServiceImpl.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,18 @@ public String getDockerCommand()
459459
return "docker";
460460
}
461461

462+
@Override
463+
public boolean useLocalDockerContainerStorage()
464+
{
465+
String value = PipelineJobService.get().getConfigProperties().getSoftwarePackagePath("USE_LOCAL_DOCKER_STORAGE");
466+
if (StringUtils.trimToNull(value) == null)
467+
{
468+
return false;
469+
}
470+
471+
return Boolean.parseBoolean(value);
472+
}
473+
462474
@Override
463475
public Collection<String> getDockerVolumes(Container c)
464476
{

0 commit comments

Comments
 (0)