github.com/Shopify/docker@v1.13.1/volume/volume_linux.go (about) 1 // +build linux 2 3 package volume 4 5 import ( 6 "fmt" 7 "strings" 8 9 mounttypes "github.com/docker/docker/api/types/mount" 10 ) 11 12 // ConvertTmpfsOptions converts *mounttypes.TmpfsOptions to the raw option string 13 // for mount(2). 14 func ConvertTmpfsOptions(opt *mounttypes.TmpfsOptions, readOnly bool) (string, error) { 15 var rawOpts []string 16 if readOnly { 17 rawOpts = append(rawOpts, "ro") 18 } 19 20 if opt != nil && opt.Mode != 0 { 21 rawOpts = append(rawOpts, fmt.Sprintf("mode=%o", opt.Mode)) 22 } 23 24 if opt != nil && opt.SizeBytes != 0 { 25 // calculate suffix here, making this linux specific, but that is 26 // okay, since API is that way anyways. 27 28 // we do this by finding the suffix that divides evenly into the 29 // value, returing the value itself, with no suffix, if it fails. 30 // 31 // For the most part, we don't enforce any semantic to this values. 32 // The operating system will usually align this and enforce minimum 33 // and maximums. 34 var ( 35 size = opt.SizeBytes 36 suffix string 37 ) 38 for _, r := range []struct { 39 suffix string 40 divisor int64 41 }{ 42 {"g", 1 << 30}, 43 {"m", 1 << 20}, 44 {"k", 1 << 10}, 45 } { 46 if size%r.divisor == 0 { 47 size = size / r.divisor 48 suffix = r.suffix 49 break 50 } 51 } 52 53 rawOpts = append(rawOpts, fmt.Sprintf("size=%d%s", size, suffix)) 54 } 55 return strings.Join(rawOpts, ","), nil 56 }