11package org .labkey .api .sequenceanalysis .run ;
22
3+ import org .apache .commons .io .FileUtils ;
34import org .apache .commons .lang3 .StringUtils ;
45import org .apache .logging .log4j .Logger ;
56import org .jetbrains .annotations .Nullable ;
67import org .labkey .api .pipeline .PipelineJobException ;
78import org .labkey .api .sequenceanalysis .pipeline .PipelineContext ;
89import org .labkey .api .sequenceanalysis .pipeline .PipelineOutputTracker ;
910import org .labkey .api .sequenceanalysis .pipeline .SequencePipelineService ;
11+ import org .labkey .api .util .FileUtil ;
1012import org .labkey .api .writer .PrintWriters ;
1113
1214import 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}
0 commit comments