1
+ use std:: collections:: HashMap ;
1
2
use std:: fs:: File ;
2
3
use std:: path:: PathBuf ;
3
4
use std:: { env, fs} ;
@@ -6,6 +7,7 @@ use anyhow::Context;
6
7
use clap:: Parser ;
7
8
use oci_spec:: image:: { self as spec, Arch } ;
8
9
use oci_tar_builder:: { Builder , WASM_LAYER_MEDIA_TYPE } ;
10
+ use sha256:: { digest, try_digest} ;
9
11
10
12
pub fn main ( ) {
11
13
let args = Args :: parse ( ) ;
@@ -21,9 +23,15 @@ pub fn main() {
21
23
let entry_point = args. name . clone ( ) + ".wasm" ;
22
24
23
25
let mut builder = Builder :: default ( ) ;
26
+ let mut layer_digests = Vec :: new ( ) ;
24
27
for module_path in args. module . iter ( ) {
25
28
let module_path = PathBuf :: from ( module_path) ;
26
29
builder. add_layer_with_media_type ( & module_path, WASM_LAYER_MEDIA_TYPE . to_string ( ) ) ;
30
+ layer_digests. push (
31
+ try_digest ( & module_path)
32
+ . context ( "failed to calculate digest for module" )
33
+ . unwrap ( ) ,
34
+ ) ;
27
35
}
28
36
29
37
for layer_config in args. layer . iter ( ) {
@@ -33,6 +41,11 @@ pub fn main() {
33
41
let layer_type = layer_options. first ( ) . unwrap ( ) ;
34
42
let layer_path = PathBuf :: from ( layer_options. last ( ) . unwrap ( ) ) ;
35
43
builder. add_layer_with_media_type ( & layer_path, layer_type. to_string ( ) ) ;
44
+ layer_digests. push (
45
+ try_digest ( & layer_path)
46
+ . context ( "failed to calculate digest for module" )
47
+ . unwrap ( ) ,
48
+ ) ;
36
49
}
37
50
38
51
if let Some ( components_path) = args. components . as_deref ( ) {
@@ -44,6 +57,11 @@ pub fn main() {
44
57
match ext {
45
58
"wasm" => {
46
59
builder. add_layer_with_media_type ( & path, WASM_LAYER_MEDIA_TYPE . to_string ( ) ) ;
60
+ layer_digests. push (
61
+ try_digest ( & path)
62
+ . context ( "failed to calculate digest for module" )
63
+ . unwrap ( ) ,
64
+ ) ;
47
65
}
48
66
_ => println ! (
49
67
"Skipping Unknown file type: {:?} with extension {:?}" ,
@@ -54,8 +72,17 @@ pub fn main() {
54
72
}
55
73
}
56
74
75
+ // Need each config to be unique since we don't have layers to make them unique in the rootfs
76
+ // https://github.com/opencontainers/image-spec/pull/1173
77
+ let unique_id = digest ( layer_digests. join ( "" ) ) ;
78
+ let mut labels: HashMap < String , String > = HashMap :: new ( ) ;
79
+ labels. insert (
80
+ "containerd.runwasi.layers" . to_string ( ) ,
81
+ unique_id,
82
+ ) ;
57
83
let config = spec:: ConfigBuilder :: default ( )
58
84
. entrypoint ( vec ! [ entry_point] )
85
+ . labels ( labels)
59
86
. build ( )
60
87
. unwrap ( ) ;
61
88
0 commit comments