@@ -151,7 +151,9 @@ func mknodChar0Overlay(cleansedOriginalPath string) error {
151151 if err := ioutil .WriteFile (lowerDummy , []byte {}, 0600 ); err != nil {
152152 return errors .Wrapf (err , "failed to create a dummy lower file %s" , lowerDummy )
153153 }
154- mOpts := fmt .Sprintf ("lowerdir=%s,upperdir=%s,workdir=%s" , lower , upper , work )
154+ // lowerdir needs ":" to be escaped: https://github.com/moby/moby/issues/40939#issuecomment-627098286
155+ lowerEscaped := strings .ReplaceAll (lower , ":" , "\\ :" )
156+ mOpts := fmt .Sprintf ("lowerdir=%s,upperdir=%s,workdir=%s" , lowerEscaped , upper , work )
155157 // docker/pkg/mount.Mount() requires procfs to be mounted. So we use syscall.Mount() directly instead.
156158 if err := syscall .Mount ("overlay" , merged , "overlay" , uintptr (0 ), mOpts ); err != nil {
157159 return errors .Wrapf (err , "failed to mount overlay (%s) on %s" , mOpts , merged )
@@ -236,7 +238,9 @@ func createDirWithOverlayOpaque(tmp string) (string, error) {
236238 if err := os .MkdirAll (lowerDummy , 0700 ); err != nil {
237239 return "" , errors .Wrapf (err , "failed to create a dummy lower directory %s" , lowerDummy )
238240 }
239- mOpts := fmt .Sprintf ("lowerdir=%s,upperdir=%s,workdir=%s" , lower , upper , work )
241+ // lowerdir needs ":" to be escaped: https://github.com/moby/moby/issues/40939#issuecomment-627098286
242+ lowerEscaped := strings .ReplaceAll (lower , ":" , "\\ :" )
243+ mOpts := fmt .Sprintf ("lowerdir=%s,upperdir=%s,workdir=%s" , lowerEscaped , upper , work )
240244 // docker/pkg/mount.Mount() requires procfs to be mounted. So we use syscall.Mount() directly instead.
241245 if err := syscall .Mount ("overlay" , merged , "overlay" , uintptr (0 ), mOpts ); err != nil {
242246 return "" , errors .Wrapf (err , "failed to mount overlay (%s) on %s" , mOpts , merged )
0 commit comments