31
31
import java .io .IOException ;
32
32
import java .io .OutputStream ;
33
33
import java .nio .charset .StandardCharsets ;
34
+ import java .time .Instant ;
34
35
import java .util .Collections ;
35
36
36
37
/** Translates an {@link Image} to a tarball that can be loaded into Docker. */
@@ -48,6 +49,7 @@ public class ImageTarball {
48
49
private final Image image ;
49
50
private final ImageReference imageReference ;
50
51
private final ImmutableSet <String > allTargetImageTags ;
52
+ private final Instant creationTime = Instant .EPOCH ;
51
53
52
54
/**
53
55
* Instantiate with an {@link Image}.
@@ -88,7 +90,8 @@ private void ociWriteTo(OutputStream out) throws IOException {
88
90
DescriptorDigest digest = layer .getBlobDescriptor ().getDigest ();
89
91
long size = layer .getBlobDescriptor ().getSize ();
90
92
91
- tarStreamBuilder .addBlobEntry (layer .getBlob (), size , "blobs/sha256/" + digest .getHash ());
93
+ tarStreamBuilder .addBlobEntry (
94
+ layer .getBlob (), size , "blobs/sha256/" + digest .getHash (), creationTime );
92
95
manifest .addLayer (size , digest );
93
96
}
94
97
@@ -99,21 +102,26 @@ private void ociWriteTo(OutputStream out) throws IOException {
99
102
manifest .setContainerConfiguration (configDescriptor .getSize (), configDescriptor .getDigest ());
100
103
tarStreamBuilder .addByteEntry (
101
104
JsonTemplateMapper .toByteArray (containerConfiguration ),
102
- "blobs/sha256/" + configDescriptor .getDigest ().getHash ());
105
+ "blobs/sha256/" + configDescriptor .getDigest ().getHash (),
106
+ creationTime );
103
107
104
108
// Adds the manifest to the tarball
105
109
BlobDescriptor manifestDescriptor = Digests .computeDigest (manifest );
106
110
tarStreamBuilder .addByteEntry (
107
111
JsonTemplateMapper .toByteArray (manifest ),
108
- "blobs/sha256/" + manifestDescriptor .getDigest ().getHash ());
112
+ "blobs/sha256/" + manifestDescriptor .getDigest ().getHash (),
113
+ creationTime );
109
114
110
115
// Adds the oci-layout and index.json
111
116
tarStreamBuilder .addByteEntry (
112
- "{\" imageLayoutVersion\" : \" 1.0.0\" }" .getBytes (StandardCharsets .UTF_8 ), "oci-layout" );
117
+ "{\" imageLayoutVersion\" : \" 1.0.0\" }" .getBytes (StandardCharsets .UTF_8 ),
118
+ "oci-layout" ,
119
+ creationTime );
113
120
OciIndexTemplate index = new OciIndexTemplate ();
114
121
// TODO: figure out how to tag with allTargetImageTags
115
122
index .addManifest (manifestDescriptor , imageReference .toStringWithQualifier ());
116
- tarStreamBuilder .addByteEntry (JsonTemplateMapper .toByteArray (index ), "index.json" );
123
+ tarStreamBuilder .addByteEntry (
124
+ JsonTemplateMapper .toByteArray (index ), "index.json" , creationTime );
117
125
118
126
tarStreamBuilder .writeAsTarArchiveTo (out );
119
127
}
@@ -127,7 +135,7 @@ private void dockerWriteTo(OutputStream out) throws IOException {
127
135
String layerName = layer .getBlobDescriptor ().getDigest ().getHash () + LAYER_FILE_EXTENSION ;
128
136
129
137
tarStreamBuilder .addBlobEntry (
130
- layer .getBlob (), layer .getBlobDescriptor ().getSize (), layerName );
138
+ layer .getBlob (), layer .getBlobDescriptor ().getSize (), layerName , creationTime );
131
139
manifestTemplate .addLayerFile (layerName );
132
140
}
133
141
@@ -136,15 +144,17 @@ private void dockerWriteTo(OutputStream out) throws IOException {
136
144
new ImageToJsonTranslator (image ).getContainerConfiguration ();
137
145
tarStreamBuilder .addByteEntry (
138
146
JsonTemplateMapper .toByteArray (containerConfiguration ),
139
- CONTAINER_CONFIGURATION_JSON_FILE_NAME );
147
+ CONTAINER_CONFIGURATION_JSON_FILE_NAME ,
148
+ creationTime );
140
149
141
150
// Adds the manifest to tarball.
142
151
for (String tag : allTargetImageTags ) {
143
152
manifestTemplate .addRepoTag (imageReference .withQualifier (tag ).toStringWithQualifier ());
144
153
}
145
154
tarStreamBuilder .addByteEntry (
146
155
JsonTemplateMapper .toByteArray (Collections .singletonList (manifestTemplate )),
147
- MANIFEST_JSON_FILE_NAME );
156
+ MANIFEST_JSON_FILE_NAME ,
157
+ creationTime );
148
158
149
159
tarStreamBuilder .writeAsTarArchiveTo (out );
150
160
}
0 commit comments