This repository has no description
1open Eio.Std
2
3let ( / ) = Eio.Path.( / )
4
5let test_data fs data =
6 let tempdir = Filename.temp_dir "void-" "-alpine" in
7 Eio.Path.(save ~create:(`If_missing 0o644) (fs / tempdir / "data.txt") data);
8 Eio.traceln "Test data in %s" tempdir;
9 tempdir
10
11let get_alpine_image ~fs ~proc =
12 let tmpdir = Filename.temp_dir "void" "alpine" in
13 Eio.traceln "Extracting alpine to %s..." tmpdir;
14 let container_id =
15 Eio.Process.parse_out proc Eio.Buf_read.take_all
16 [ "docker"; "run"; "-d"; "alpine" ]
17 |> String.trim
18 in
19 Eio.traceln "Container %s" container_id;
20 let () =
21 Eio.Process.run proc
22 [
23 "docker";
24 "export";
25 container_id;
26 "-o";
27 Filename.concat tmpdir "alpine.tar.gz";
28 ]
29 in
30 Eio.traceln "Untarring...";
31 Eio.Path.mkdir ~perm:0o777 (fs / tmpdir / "rootfs");
32 let () =
33 Eio.Process.run proc
34 [
35 "tar";
36 "-xf";
37 Filename.concat tmpdir "alpine.tar.gz";
38 "-C";
39 Filename.concat tmpdir "rootfs";
40 ]
41 in
42 Filename.concat tmpdir "rootfs"
43
44(* This example read-only mounts a copy of busybox
45 into the root-filesystem of the process. *)
46let () =
47 Eio_posix.run @@ fun env ->
48 Switch.run @@ fun sw ->
49 let fs = env#fs in
50 let proc = env#process_mgr in
51 let alpine_img = get_alpine_image ~fs ~proc in
52 let mount_src = test_data fs "Hello, World!" in
53 let open Void in
54 let args =
55 let l = Array.length Sys.argv in
56 if l <= 1 then
57 [
58 "/bin/ash"; "-c"; "/bin/echo hello > /hello.txt && /bin/cat /hello.txt";
59 ]
60 else Array.sub Sys.argv 1 (l - 1) |> Array.to_list
61 in
62 let void =
63 empty |> rootfs ~mode:RW alpine_img
64 |> mount ~mode:R ~src:mount_src ~tgt:"data"
65 |> exec args
66 in
67 let t = Void.spawn ~sw void in
68 let status = Promise.await (Void.exit_status t) in
69 Eio.traceln "Status: %s" (Void.exit_status_to_string status)