22
33import java .io .File ;
44import java .io .IOException ;
5+ import java .io .InputStream ;
56import java .net .URI ;
67import java .net .URISyntaxException ;
78import java .util .ArrayList ;
@@ -33,7 +34,8 @@ public class BuildImgCmd extends AbstrDockerCmd<BuildImgCmd, ClientResponse> {
3334
3435 private static final Logger LOGGER = LoggerFactory .getLogger (BuildImgCmd .class );
3536
36- private File dockerFolder ;
37+ private File dockerFolder = null ;
38+ private InputStream tarInputStream = null ;
3739 private String tag ;
3840 private boolean noCache ;
3941
@@ -43,6 +45,11 @@ public BuildImgCmd(File dockerFolder) {
4345 this .dockerFolder = dockerFolder ;
4446 }
4547
48+ public BuildImgCmd (InputStream tarInputStream ) {
49+ Preconditions .checkNotNull (tarInputStream , "tarInputStream is null" );
50+ this .tarInputStream = tarInputStream ;
51+ }
52+
4653 public BuildImgCmd withTag (String tag ) {
4754 Preconditions .checkNotNull (tag , "Tag is null" );
4855 this .tag = tag ;
@@ -55,17 +62,49 @@ public BuildImgCmd withNoCache(boolean noCache) {
5562 }
5663
5764 protected ClientResponse impl () {
58-
59- Preconditions .checkArgument (dockerFolder .exists (), "Path %s doesn't exist" , dockerFolder );
60- Preconditions .checkArgument (dockerFolder .isDirectory (), "Folder %s doesn't exist" , dockerFolder );
61- Preconditions .checkState (new File (dockerFolder , "Dockerfile" ).exists (), "Dockerfile doesn't exist in " + dockerFolder );
62-
65+ if (tarInputStream == null ) {
66+ File dockerFolderTar = buildDockerFolderTar ();
67+ try {
68+ return callDocker (FileUtils .openInputStream (dockerFolderTar ));
69+ } catch (IOException e ) {
70+ throw new DockerException (e );
71+ } finally {
72+ FileUtils .deleteQuietly (dockerFolderTar );
73+ }
74+ } else {
75+ return callDocker (tarInputStream );
76+ }
77+ }
78+
79+ protected ClientResponse callDocker (final InputStream dockerFolderTarInputStream ) {
6380 MultivaluedMap <String , String > params = new MultivaluedMapImpl ();
6481 params .add ("t" , tag );
6582 if (noCache ) {
6683 params .add ("nocache" , "true" );
6784 }
6885
86+ WebResource webResource = baseResource .path ("/build" ).queryParams (params );
87+
88+ try {
89+ LOGGER .trace ("POST: {}" , webResource );
90+ return webResource
91+ .type ("application/tar" )
92+ .accept (MediaType .TEXT_PLAIN )
93+ .post (ClientResponse .class , dockerFolderTarInputStream );
94+ } catch (UniformInterfaceException exception ) {
95+ if (exception .getResponse ().getStatus () == 500 ) {
96+ throw new DockerException ("Server error" , exception );
97+ } else {
98+ throw new DockerException (exception );
99+ }
100+ }
101+ }
102+
103+ protected File buildDockerFolderTar () {
104+ Preconditions .checkArgument (dockerFolder .exists (), "Path %s doesn't exist" , dockerFolder );
105+ Preconditions .checkArgument (dockerFolder .isDirectory (), "Folder %s doesn't exist" , dockerFolder );
106+ Preconditions .checkState (new File (dockerFolder , "Dockerfile" ).exists (), "Dockerfile doesn't exist in " + dockerFolder );
107+
69108 // ARCHIVE TAR
70109 String archiveNameWithOutExtension = UUID .randomUUID ().toString ();
71110
@@ -112,31 +151,11 @@ protected ClientResponse impl() {
112151 }
113152
114153 dockerFolderTar = CompressArchiveUtil .archiveTARFiles (dockerFolder , filesToAdd , archiveNameWithOutExtension );
115-
154+ return dockerFolderTar ;
116155 } catch (IOException ex ) {
117156 FileUtils .deleteQuietly (dockerFolderTar );
118157 throw new DockerException ("Error occurred while preparing Docker context folder." , ex );
119158 }
120-
121- WebResource webResource = baseResource .path ("/build" ).queryParams (params );
122-
123- try {
124- LOGGER .trace ("POST: {}" , webResource );
125- return webResource
126- .type ("application/tar" )
127- .accept (MediaType .TEXT_PLAIN )
128- .post (ClientResponse .class , FileUtils .openInputStream (dockerFolderTar ));
129- } catch (UniformInterfaceException exception ) {
130- if (exception .getResponse ().getStatus () == 500 ) {
131- throw new DockerException ("Server error" , exception );
132- } else {
133- throw new DockerException (exception );
134- }
135- } catch (IOException e ) {
136- throw new DockerException (e );
137- } finally {
138- FileUtils .deleteQuietly (dockerFolderTar );
139- }
140159 }
141160
142161 private static boolean isFileResource (String resource ) {
0 commit comments