github.com/rish1988/moby@v25.0.2+incompatible/internal/testutils/specialimage/emptyfs.go (about) 1 package specialimage 2 3 import ( 4 "io" 5 "os" 6 "path/filepath" 7 ) 8 9 // EmptyFS builds an image with an empty rootfs. 10 // Layout: Legacy Docker Archive 11 // See https://github.com/docker/docker/pull/5262 12 // and also https://github.com/docker/docker/issues/4242 13 func EmptyFS(dir string) error { 14 if err := os.WriteFile(filepath.Join(dir, "manifest.json"), []byte(`[{"Config":"11f64303f0f7ffdc71f001788132bca5346831939a956e3e975c93267d89a16d.json","RepoTags":["emptyfs:latest"],"Layers":["511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158/layer.tar"]}]`), 0o644); err != nil { 15 return err 16 } 17 18 if err := os.Mkdir(filepath.Join(dir, "blobs"), 0o755); err != nil { 19 return err 20 } 21 22 blobsDir := filepath.Join(dir, "511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158") 23 if err := os.Mkdir(blobsDir, 0o755); err != nil { 24 return err 25 } 26 27 if err := os.WriteFile(filepath.Join(dir, "VERSION"), []byte(`1.0`), 0o644); err != nil { 28 return err 29 } 30 if err := os.WriteFile(filepath.Join(dir, "repositories"), []byte(`{"emptyfs":{"latest":"511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158"}}`), 0o644); err != nil { 31 return err 32 } 33 if err := os.WriteFile(filepath.Join(dir, "11f64303f0f7ffdc71f001788132bca5346831939a956e3e975c93267d89a16d.json"), []byte(`{"architecture":"x86_64","comment":"Imported from -","container_config":{"Hostname":"","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":null,"Cmd":null,"Image":"","Volumes":null,"WorkingDir":"","Entrypoint":null,"OnBuild":null,"Labels":null},"created":"2013-06-13T14:03:50.821769-07:00","docker_version":"0.4.0","history":[{"created":"2013-06-13T14:03:50.821769-07:00","comment":"Imported from -"}],"rootfs":{"type":"layers","diff_ids":["sha256:84ff92691f909a05b224e1c56abb4864f01b4f8e3c854e4bb4c7baf1d3f6d652"]}}`), 0o644); err != nil { 34 return err 35 } 36 37 if err := os.WriteFile(filepath.Join(blobsDir, "json"), []byte(`{"id":"511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158","comment":"Imported from -","created":"2013-06-13T14:03:50.821769-07:00","container_config":{"Hostname":"","Domainname":"","User":"","Memory":0,"MemorySwap":0,"CpuShares":0,"AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"PortSpecs":null,"ExposedPorts":null,"Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":null,"Cmd":null,"Image":"","Volumes":null,"WorkingDir":"","Entrypoint":null,"NetworkDisabled":false,"OnBuild":null},"docker_version":"0.4.0","architecture":"x86_64","Size":0}`+"\n"), 0o644); err != nil { 38 return err 39 } 40 41 layerFile, err := os.OpenFile(filepath.Join(blobsDir, "layer.tar"), os.O_CREATE|os.O_WRONLY, 0o644) 42 if err != nil { 43 return err 44 } 45 defer layerFile.Close() 46 47 // 10240 NUL bytes is a valid empty tar archive. 48 _, err = io.Copy(layerFile, io.LimitReader(zeroReader{}, 10240)) 49 if err != nil { 50 return err 51 } 52 53 return nil 54 } 55 56 type zeroReader struct{} 57 58 func (_ zeroReader) Read(p []byte) (n int, err error) { 59 l := len(p) 60 for idx := 0; idx < l; idx++ { 61 p[idx] = 0 62 } 63 return l, nil 64 }